我有一个用户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,它可以工作,但同时影响椭圆和图形!所以看起来它应用于画布,而不是椭圆?
答案 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
将阻止图形拦截鼠标事件。