如何处理由没有Click事件的控件组成的自定义WPF控件上的Click事件

时间:2016-10-29 13:43:13

标签: c# .net wpf custom-controls

我正在创建一个自定义ToolBar控件,我可以在我的WPF应用程序中使用它。

我的CustomToolBar控件基于StackPanel控件,将包含多个CustomToolBarButton控件。

我的CustomToolBarButtons基于垂直StackPanel,包含一个Image控件和一个Label控件。

我想以编程方式为我的CustomToolBarButtons创建一个Click事件,该事件将在单击Image或label时触发。不幸的是,Image和Label控件都没有WPF中的Click事件。

这对我来说很意外,因为我习惯了WinForms控件,绝大多数都默认使用Click事件。我是否必须创建自定义图像和标签控件并为它们创建Click事件,或者是否有更简洁的方法来执行此操作?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

嗯,使用标准功能并不是一种简单明了的方法。我通过创建自己的触发器(从Blend SDK中派生出System.Windows.Interactivity.TriggerBase)来解决这个问题,以便在我的项目中我可以执行以下操作:

GHCi> [1, 2] `intersect` [2, 3] `union` [3, 4] & elem 1
False

有效地, <Label> <i:Interaction.Triggers> <mu:MouseTrigger MouseButton="Middle" MouseAction="Click"> <i:InvokeCommandAction Command="{Binding Path=Close}" /> </mu:MouseTrigger> </i:Interaction.Triggers> </Label> 类将处理附加到MouseTrigger的MouseDown和MouseUp事件,并使用它来调用与触发器关联的操作。但是,代码比这更复杂,因为我也做了鼠标捕获和我利用一个内部帮助器类,这样我就可以向同一个元素添加多个触发器,只有一个辅助类的实例处理事件&amp;捕获该元素的鼠标。

对于实际操作,我只使用现有的Blend或Prism操作,例如InvokeCommandAction。

如果您有兴趣,请the project。粘贴到这种格式太大了。它使用了一些C#6.0功能,但您可以通过删除一些空条件运算符来轻松修改它以使用旧版本的C#。它需要您安装Blend SDK,因为它依赖于System.Windows.Interactivity(只要您选择该选项,就应该与Visual Studio一起安装)。 UIElement是公开可见的类,它是与功能交互的点。 MouseTrigger是提到的内部助手类。

我建议不要沿着自定义控件的路线走,而是使用某种机制(这个或其他)使用WPF和XAML带来的附加属性框架来扩展现有功能。< / p>

答案 1 :(得分:1)

在WinForms中,您只需创建自定义控件即可获得非标准外观,在WPF中不再需要这样做。

WPF方式:不要让Stackpanel的孩子实施Click行为,而是让Button看起来像所需的Stackpanel

可以设置Content

<Button>
    <StackPanel >
        <Image Source="C:\myFiles\myPic.png"/>
        <Label HorizontalAlignment="Center">SomeTxt</Label>
    </StackPanel>
</Button> 

但是这样它仍然看起来像Button,为了解决这个问题,我们可以设置Template代替:

<Button>
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <StackPanel >
                <Image Source="C:\myFiles\myPic.png"/>
                <Label HorizontalAlignment="Center">SomeTxt</Label>
            </StackPanel>
        </ControlTemplate>
    </Button.Template>
</Button>   

两种解决方案都会引发Click事件,点击图像或标签。