Используйте триггер стиля для задания свойства вложенного объекта



У меня есть маленький многоугольник, написанный на большом холсте. Я хочу выделить многоугольник, когда мышь перемещается по холсту. Код выглядит так:



<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>


Однако сеттер не видит "многоугольника".
499   3  

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

    Ничего не найдено.