2013-03-02 14 views
2

我遇到了一个问题,其中路径内容的按钮只检测鼠标点击的路径。我希望为ux在按钮的任何位置注册点击。我已将按钮的背景设置为null和透明,所以顶部控件容器指定背景样式。如何击中无效或透明背景上的检测?

下面是另一个SO后:Mouse event on transparent background

如前所述我都试过透明和空为止。

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:wpfMyCustomControl"> 

<ControlTemplate x:Key="IconTemplate" TargetType="{x:Type ContentControl}"> 
    <Grid> 
     <Path Name="ForegroundSymbol" Data="M0,0 L1,0 1,1 0,1 0.5,0.5 z" Fill="{TemplateBinding Foreground}" Stretch="Fill" /> 
    </Grid> 
</ControlTemplate> 

<Style x:Key="IconButtonStyle" TargetType="{x:Type RepeatButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type RepeatButton}"> 
       <Grid> 
        <ContentControl Name="icon" Template="{StaticResource IconTemplate}" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 


<ControlTemplate x:Key="MyCustomTemplate" TargetType="{x:Type local:MyCustomControl}"> 
    <Grid Name="LayoutRoot" Background="Red"> 
     <RepeatButton Background="{x:Null}" Style="{StaticResource ResourceKey=IconButtonStyle}" /> 
    </Grid> 
</ControlTemplate> 

<Style TargetType="{x:Type local:MyCustomControl}"> 
    <Setter Property="Template" Value="{StaticResource ResourceKey=MyCustomTemplate}" /> 
</Style> 
</ResourceDictionary> 

如果我从“样式”中删除“x:Key”属性,控件呈现。我已经能够重现这个问题,使用上面的xaml控件样式,点击检测不会在按钮的“背景”部分触发。

+0

如果你提供了一些代码给我们看,会有很大的帮助。 – JerKimball 2013-03-02 00:51:55

+0

'iconstyle'如何?任何问题都可能与控制模板的“VisualTree”一致。 – JerKimball 2013-03-02 02:56:12

+0

我无法用按钮,您的''和按钮的{{:Null}'背景来重现此操作。这证明这是你造成这种情况的'Style'。开始解构风格,直到问题消失,或者以其他方式开始:从空白样式开始,添加东西,直到问题出现。无论哪种方式,你会发现究竟是什么导致问题,并反过来将使您能够解决问题。 – 2013-03-04 07:12:58

回答

1

如果背景是透明的,如果您真的使用它,HitTesting将会起作用。您正在应用样式,但没有包含样式,所以我不能说,但如果在该样式中设置了模板,并且您没有使用ControlTemplate中的背景,则设置背景无意义。通常,模板中的根元素的背景会对背景(通常是面板或边框)执行TemplateBinding。元素本身不使用背景。另一种选择是重写HitTestCore方法。您可以在TextBlock的实现中查看Reflector/ILSpy,因为它会覆盖此实例以确保其rect中的任何点(而不仅仅是文本的字符)都是有效的生命点。

编辑:根据您提供的样式/模板,我所描述的问题就是这个问题。您需要在ControlTemplate内使用背景,否则它不会产生任何影响。所以IconTemplate应该是这样的:

<ControlTemplate x:Key="IconTemplate" TargetType="{x:Type ContentControl}"> 
    <Grid Background="{TemplateBinding Background}"> 
     <Path Name="ForegroundSymbol" Data="M0,0 L1,0 1,1 0,1 0.5,0.5 z" Fill="{TemplateBinding Foreground}" Stretch="Fill" /> 
    </Grid> 
</ControlTemplate> 
+0

你们把我带到别的地方,这显然是问题所在。在我的“