2010-11-23 41 views
0

我有一个用户cotrol,它包含一个包含一个椭圆和一个viewbox的画布。椭圆是背景,并且视图框在运行时用从另一个程序集加载的图形填充。我在为控件创建一个“热”行为时遇到了问题,因此当鼠标移动到其上时,椭圆会改变颜色。在父元素的触发器上设置子元素的属性

如果我在椭圆上放置了一个触发器,那么颜色会发生变化,但当鼠标移过视图框中的图形时,它会变回,因为视框不是椭圆的子节点。

从我读过的,应该可以从父元素上的触发器设置子元素的属性。但是,我无法得到这个工作。我的代码如下所示:

<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

当您使用具有ClassName.PropertyName属性的Setter时,您没有在所有ClassName对象上设置PropertyName。相反,您正在设置样式化对象类型上的ClassName.PropertyName(在您的案例中为Canvas)。给一个ClassName.PropertyName只是该属性的一个类合格路径。对于不透明度,Canvas.Opacity == Ellipse.Opacity == UIElement.Opacity。

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

+0

感谢您的解释!这只是我WPF编码的第二周,所以还有很多东西需要学习。这是否意味着在触发器中设置子元素的属性是不可能的? – NPVN 2010-11-23 19:51:50

1

只需在您的ViewBox上设置IsHitTestVisible=False怎么办?这将完全从命中测试中移除它,并且鼠标事件将注册到您的椭圆。

相关问题