我正在创建一个自定义ToolBar控件,我可以在我的WPF应用程序中使用它。
我的CustomToolBar控件基于StackPanel控件,将包含多个CustomToolBarButton控件。
我的CustomToolBarButtons基于垂直StackPanel,包含一个Image控件和一个Label控件。
我想以编程方式为我的CustomToolBarButtons创建一个Click事件,该事件将在单击Image或label时触发。不幸的是,Image和Label控件都没有WPF中的Click事件。
这对我来说很意外,因为我习惯了WinForms控件,绝大多数都默认使用Click事件。我是否必须创建自定义图像和标签控件并为它们创建Click事件,或者是否有更简洁的方法来执行此操作?
感谢您的帮助!
答案 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事件,点击图像或标签。