Используйте триггер стиля, чтобы установить свойство вложенного объекта - PullRequest
10 голосов
/ 01 ноября 2011

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

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

19 голосов
/ 01 ноября 2011

Вы не можете использовать 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>
1 голос
/ 01 ноября 2011

Попробуйте EventTrigger, потому что другие виды триггеров вы можете использовать только в шаблонах или стилях.И мы уже знаем, что Style.Trigger не позволяет ваш сценарий.Итак, вот рабочий пример для вас:

<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>
0 голосов
/ 01 ноября 2011

Он ищет свойство Canvas, называемое 'polygon', которое в свою очередь имеет свойство 'Stroke'. Вам нужно использовать TargetName, если вы хотите, чтобы установщик нацелился на другой объект.

<Setter TargetName="polygon" Property="Stroke" Value="#EEEEEE" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...