WPF命令未在图像按钮上触发单击

时间:2013-10-16 09:53:23

标签: c# wpf image binding

我正在尝试制作播放器(某种程度)控件。我有一个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

3 个答案:

答案 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,您可以如何做到这一点。