2010-11-23 2 views
0

У меня есть пользовательский cotrol, состоящий из холста, который содержит эллипс и окно просмотра. Эллипс - это фон, и окно просмотра заполняется во время выполнения графикой, загруженной из другой сборки. У меня возникают проблемы с созданием «горячего» поведения для моего элемента управления, так что эллипс меняет цвет, когда мышь над ним.Настройка свойств дочерних элементов в триггере на родительском элементе

Если я поместил триггер на эллипс, тогда цвет изменится, но он изменится, когда мышь перемещается по графику в окне просмотра, потому что окно просмотра не является дочерним элементом эллипса.

Из того, что я прочитал, должно быть возможно установить свойства для дочерних эльментов с триггера на родительском элементе. Однако я не могу заставить это работать. Мой код выглядит так:

<Viewbox Margin="5" > 
     <Viewbox.Resources> 
      <SolidColorBrush x:Key="HotColor" Color="Blue"/> 
      <SolidColorBrush x:Key="ColdColor" Color="Red"/> 
      <Style TargetType="Canvas" x:Key="BackgroundStyle"> 
       <Setter Property="Ellipse.Fill" Value="{StaticResource ColdColor}"/> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter Property="Ellipse.Fill" Value="{StaticResource HotColor}"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Viewbox.Resources> 
     <Canvas Width="44.000" Height="44.000" Style="{StaticResource BackgroundStyle}"> 
      <Ellipse Width="44" Height="44"/> 
      <Viewbox Name="ButtonGraphics"/> 
     </Canvas> 
    </Viewbox> 

В результате я не получаю никакого цвета на моем эллипсе. Забавно, если я попытаюсь установить Ellipse.Opacity вместо этого, он работает, но влияет как на эллипс, так и на графику! Значит, похоже, что оно применяется к холсту, а не к эллипсу?

ответ

1

Когда вы используете Setter с свойством ClassName.PropertyName, вы не устанавливаете PropertyName для всех объектов ClassName. Вместо этого вы устанавливаете ClassName.PropertyName для стилизованного типа объекта (в вашем случае Canvas). Предоставление ClassName.PropertyName - это только класс, соответствующий этому свойству. Для непрозрачности, Canvas.Opacity == Ellipse.Opacity == UIElement.Opacity.

Теперь, чтобы выполнить то, что вы хотите, установка IsHitTestVisible=False на ButtonGraphics ViewBox не позволит графике перехватывать события мыши.

+0

Спасибо за объяснение! Это только моя вторая неделя кодирования WPF, поэтому многое еще предстоит узнать. Означает ли это, что устанавливать дочерние элементы в триггере невозможно? – NPVN 2010-11-23 19:51:50

1

Как насчет того, чтобы установить только IsHitTestVisible=False на ViewBox? Это полностью удалит его из тестирования на попадание, а события мыши будут регистрироваться на вашем эллипсе.

Смежные вопросы