Используйте триггер стиля для задания свойства вложенного объекта
У меня есть маленький многоугольник, написанный на большом холсте. Я хочу выделить многоугольник, когда мышь перемещается по холсту. Код выглядит так:
<UserControl ...>
<Canvas Name="canvas" Height="22" Width="22">
<Canvas.Resources>
<Style TargetType="Canvas">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="false">
<Setter Property="polygon.Stroke" Value="#EEEEEE"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="polygon.Stroke" Value="Aqua"/>
</Trigger>
</Style.Triggers>
</Style>
</Canvas.Resources>
<Polygon Points="11,1 16,6 16,16 11,21" Name="polygon">
<Polygon.Fill>
<SolidColorBrush Color="#EEEEEE"/>
</Polygon.Fill>
</Polygon>
</Canvas>
</UserControl>
Однако сеттер не видит "многоугольника".
3 ответов:
Вы не можете использовать
Settersтаким образом, если вы используете этот вид нотации, механизм будет искать присоединенное свойство, или если для свойства типа перед точкой не было установленоStyle.TargetType.Проще всего, вероятно, применить стиль к самому полигону и использовать
DataTrigger, который привязывается кCanvas, чтобы вы могли вызвать его свойства.<Polygon Points="11,1 16,6 16,16 11,21" Name="polygon"> <Polygon.Fill> <SolidColorBrush Color="#EEEEEE"/> </Polygon.Fill> <Polygon.Style> <Style TargetType="{x:Type Polygon}"> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type Canvas}}}" Value="True"> <Setter Property="Stroke" Value="Red"/> </DataTrigger> </Style.Triggers> </Style> <Polygon.Style> </Polygon>
Попробуйте
EventTrigger, потому что другие типы триггеров можно использовать только в шаблонах или стилях. И мы уже знаем этот стиль.Триггер не позволяет использовать ваш сценарий. Итак, вот рабочий пример для вас:<Canvas Name="canvas" Height="22" Width="22"> <Polygon Points="11,1 16,6 16,16 11,21" Name="polygon"> <Polygon.Fill> <SolidColorBrush x:Name="brush" Color="#EEEEEE"/> </Polygon.Fill> <Polygon.Triggers> <EventTrigger RoutedEvent="UIElement.MouseEnter"> <BeginStoryboard> <Storyboard Storyboard.TargetName="brush" Storyboard.TargetProperty="Color"> <ColorAnimation From="#EEEEEE" To="Aqua" Duration="00:00:00.01" /> </Storyboard> </BeginStoryboard> </EventTrigger> <EventTrigger RoutedEvent="UIElement.MouseLeave"> <BeginStoryboard> <Storyboard Storyboard.TargetName="brush" Storyboard.TargetProperty="Color"> <ColorAnimation From="Aqua" To="#EEEEEE" Duration="00:00:00.01" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Polygon.Triggers> </Polygon> </Canvas>
Он ищет свойство холста под названием "полигон", которое, в свою очередь, имеет свойство под названием "обводка". Вам нужно использовать TargetName, если вы хотите, чтобы сеттер нацелился на другой объект.
<Setter TargetName="polygon" Property="Stroke" Value="#EEEEEE" />
Comments