Установка свойств дочерних элементов в триггере родительского элемента - PullRequest
0 голосов
/ 23 ноября 2010

У меня есть пользовательский 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 вместо него, он работает, но влияет как на эллипс, так и на графику! Значит, похоже, что он применяется к холсту, а не к эллипсу?

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

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

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

1 голос
/ 23 ноября 2010

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

...