0

我有一个用户控件,它由一个包含椭圆和视图框的画布组成。椭圆是背景,视图框在运行时用从另一个程序集加载的图形填充。我在为我的控件创建“热”行为时遇到问题,因此当鼠标悬停在椭圆上时椭圆会改变颜色。

如果我在椭圆上放置一个触发器,那么颜色会改变,但是当鼠标移到视图框中的图形上时它会变回来,因为视图框不是椭圆的子对象。

根据我的阅读,应该可以从父元素的触发器中设置子元素的属性。但是,我无法让它工作。我的代码如下所示:

    <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,它会起作用,但会影响椭圆和图形!所以看起来它被应用于画布,而不是椭圆?

4

2 回答 2

1

IsHitTestVisible=False在您的 ViewBox 上进行设置怎么样?这将完全从命中测试中删除它,并且鼠标事件将注册到您的 Ellipse。

于 2010-11-23T16:59:59.503 回答
1

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

Now, in order to accomplish what you want, setting IsHitTestVisible=False on the ButtonGraphics ViewBox will prevent the graphics from intercepting mouse events.

于 2010-11-23T19:22:47.150 回答