我遇到了一个问题,其中带有路径内容的按钮仅检测路径上的鼠标点击。对于ux,我想在按钮的任何位置注册点击。我已将按钮的背景设置为null和transparent,因此顶部控件容器指示背景样式。
这是另一篇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 :(得分:6)
您应该使用几乎的背景,而不是使用透明背景
透明。这样,Click
- 事件仍会被触发,但按钮仍然显示为透明
类似的东西:
<RepeatButton Background="#01FFFFFF" Style="{StaticResource ResourceKey=IconButtonStyle}" />
颜色定义的前两位数字定义Transparency
或Alpha
值。
答案 1 :(得分:1)
如果您实际使用背景是透明的话,HitTesting会起作用。你正在应用一个Style而不包括Style,所以我不能说但是如果你在那个Style中设置了模板并且你没有在ControlTemplate中使用Background,那么设置Background就没有意义了。通常,模板中根元素的背景执行到背景的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>
答案 2 :(得分:0)
如果您不想设置颜色而不是设置透明,则需要为命中检测提供背景颜色。