我正在尝试制作播放器(某种程度)控件。我有一个Usercontrol for按钮已经可用 (公司控制)。我试图给我的按钮添加我添加到其内容中的图像的形状。
问题是当我删除模板样式(根据图像边界适合我的按钮边界)时,当我尝试单击按钮时,我无法触发关联的ToolBarCommand。基本上,我无法单击按钮本身。
对此有所帮助并没有太大帮助,我试图IsHitTestVisible="False"
对图像 - 但这也无济于事。
以下是我的代码:
<my:NewButton Command="{Binding ToolBarCommand}" CommandParameter="Play">
<my:NewButton.Style>
<Style>
<Setter Property="my:NewButton.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type my:NewButton}">
<ContentPresenter HorizontalAlignment=" TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</my:NewButton.Style>
<my:NewButton.Content>
<Image Source="{Binding PlayState}" IsHitTestVisible="False" />
</my:NewButton.Content>
</my:NewButton>
非常感谢任何帮助。 P.S:VS2012,.net 4.0
答案 0 :(得分:1)
您需要一些非空的颜色,并在按钮的可视树中点击测试可见像素,以使其具有命中测试可见性。
您故意在图片上设置IsHitTestVisible="False"
。如果你删除它,它应该工作,如果图像有透明像素 - 这些将不会“感觉”点击。
如果你必须在图像上有IsHitTestVisible="False"
,那么在控制模板中:
<Border Background="Transparent">
<ContentPresenter HorizontalAlignment=" TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
边框将是“感觉”鼠标点击的边框。
您甚至可以在按钮上设置Padding
,并且拥有比图像更大的命中测试区域。
答案 1 :(得分:0)
应用ControlTemplate
功能时,控件的外观应完全更改。 ContentPresent
是继承按钮功能以进行图像控制的简便方法之一。 IsHitTestVisible=False
使Image控件不会触发click事件。你可以试试下面的代码片段
<my:NewButton Command="{Binding ToolBarCommand}" CommandParameter="Play">
<my:NewButton.Template>
<ControlTemplate TargetType="{x:Type my:NewButton}">
<StackPanel>
<Image Source="{Binding PlayState}"/>
<ContentPresenter/>
</StackPanel>
</ControlTemplate>
</my:NewButton.Template>
</my:NewButton>
答案 2 :(得分:0)
如果在图像上设置IsHitTestVisible="False"
,按钮将无法点击,除非在其后面还有其它内容可以看到点击(如XAMeLi答案中的透明边框)。但是IsHitTestVisible为true(默认值),它应该是。在以下示例中,即使图像是透明的,也会触发Click事件:
<Button Click="Button_Click">
<Button.Template>
<ControlTemplate TargetType="Button">
<ContentPresenter RecognizesAccessKey="True" />
</ControlTemplate>
</Button.Template>
<Image Source="..." />
</Button>
因此,如果这对您不起作用,我认为NewButton
课程中肯定会发生奇怪的事情。
如果我理解正确,您想要使按钮的可点击区域由图像的非透明区域定义。
设置IsHitTestVisible
使整个图像元素不可点击,而不仅仅是透明区域。这对你有帮助的唯一方法是,如果你在图像后面有一个透明的形状来捕捉点击。
至于使用图像本身,我认为WPF没有任何内置支持。您可以使用Window.AllowsTransparency以这种方式定义整个窗口的形状,但这对您没有帮助。
您需要通过覆盖要成形的图像元素上的HitTestCore来手动执行命中测试。有一个示例here,您可以如何做到这一点。