Я работаю над элементом управления ссылками в WPF, который соответствует текст со ссылками на значки в Руководстве по пользовательскому интерфейсу Windows. Я хочу иметь некоторый текст в гиперссылке, которая появляется справа от некоторого изображения.
В моем случае я начал с использования TextBlock
, который содержал Hyperlink
, который затем содержал мое изображение и некоторый текст.
<TextBlock>
<Hyperlink>
<Rectangle Height="16"
Width="16"
Fill="{StaticResource MyIconBrush}"
Stretch="UniformToFill"
VerticalAlignment="Center"
HorizontalAlignment="Left" />
<Run>My link text</Run>
</Hyperlink>
</TextBlock>
Однако проблема заключалась в том, что изображение, которое было выше моего текста, создавало эффект, когда текст был выровнен по низу. К сожалению, я не нашел способа управлять выравниванием по вертикали внутри TextBlock
или Hyperlink
, поэтому я прибегнул к альтернативному макету, в котором Hyperlink
и прямоугольник, представляющие мою векторную иконку, разделены, чтобы заставить их правильно выровняйте, как показано ниже.
<StackPanel Orientation="Horizontal">
<Rectangle Height="16"
Width="16"
Fill="{StaticResource MyIconBrush}"
Stretch="UniformToFill"
VerticalAlignment="Center"
HorizontalAlignment="Left" />
<TextBlock VerticalAlignment="Center">
<Hyperlink>My link text<Hyperlink>
</TextBlock>
</StackPanel>
Однако проблема с этим заключается в том, что теперь, когда мой значок и мой Hyperlink
разделены, я не получаю отображение своей ссылки при наведении курсора мыши, когда я нахожусь над своим значком, и наоборот. Также у моего Hyperlink
есть возможность подключить команду, но у Rectangle и StackPanel нет, поэтому, если я использую Hyperlink.Command
, значок не будет выполнять команду.
Так что это заставило меня задуматься, как мне имитировать MouseOver для данного элемента управления, например, с флажком, где вы получаете эффект MouseOver для поля, когда вы на самом деле наводите указатель мыши на связанный с ним текст. Я знаю, что в мире HTML элемент label имеет для , который можно использовать для указания того, какой элемент управления он помечает, что в основном будет делать то, что я ищу. Также я могу представить, что в других сценариях было бы неплохо иметь метку, которая при наведении указателя мыши показывает соответствующее текстовое поле, как если бы мышь находилась над ним, и, возможно, при щелчке фокус также передается соответствующему текстовому полю. На данный момент, хотя меня в основном интересует, как заставить метку или элемент, подобный метке, в WPF действовать как прокси для данного элемента управления с точки зрения его состояния MouseOver. Также я хотел бы сделать это исключительно в XAML, если это возможно.
ОБНОВЛЕНИЕ: я также пытался сделать следующее, но безуспешно. Я получаю желаемый внешний вид, но ссылки под значком оказалось недостаточно для получения событий мыши. Я предполагаю, что тесты попадания работают только тогда, когда мышь фактически находится над отображаемым текстом, независимо от заполнения элемента управления.
<Grid>
<Rectangle Height="16"
Width="16"
Fill="{StaticResource MyIconBrush}"
Stretch="UniformToFill"
HorizontalAlignment="Left"
VerticalAlignment="Center"
IsHitTestVisible="False"
Focusable="False"/>
<TextBlock Padding="18,0,0,0"
VerticalAlignment="Center">
<Hyperlink>Configure additional filters...</Hyperlink>
</TextBlock>
</Grid>
<Hyperlink>My link text<Hyperlink>
заканчивается на<Hyperlink>
, а не на</Hyperlink>
. - person Peter Mortensen   schedule 09.08.2019