在父元素的触发器中设置子元素的属性

时间:2010-11-23 15:58:19

标签: wpf xaml triggers setter ellipse

我有一个用户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 个答案:

答案 0 :(得分:1)

如何在ViewBox上设置IsHitTestVisible=False呢?这将完全从命中测试中删除它,鼠标事件将注册到您的Ellipse。

答案 1 :(得分:1)

当您使用具有ClassName.PropertyName属性的Setter时,您没有在所有ClassName对象上设置PropertyName。相反,您在样式化对象类型(在您的情况下为Canvas)上设置ClassName.PropertyName。提供ClassName.PropertyName只是该属性的类限定路径。对于不透明度,Canvas.Opacity == Ellipse.Opacity == UIElement.Opacity。

现在,为了实现您的目标,在ButtonGraphics ViewBox上设置IsHitTestVisible=False将阻止图形拦截鼠标事件。