如何知道DropDownButton中点击了什么
本文关键字:什么 何知道 DropDownButton | 更新日期: 2023-09-27 17:58:07
在此页面中,DropDownButton使用ContextMenu来显示ItemsSource。我们如何知道用户点击了什么?按钮上的Click事件不适用于菜单,而是按钮本身。我没有看到其他事件。
我在寻找相同答案时遇到了这个问题。我从来没有真正在网上找到任何东西,但我自己发现了这个解决方案。也许这对将来的某个人会有所帮助。
如前所述,DropDownButton
使用ContextMenu
来显示其ItemsSource
。基本上,我想要的是一个按钮上的"菜单式"下拉菜单。例如,假设您有一个DropDownButton
,上面写着"添加"。也许你想要两个选项,如"添加新的"answers"添加现有的"。所以这就是我所做的。。。
首先,我制作了一些对象来保存标题/内容和命令。
public class TitledCommand
{
public String Title { get; set; }
public ICommand Command { get; set; }
}
从理论上讲,您将有一个列表来绑定到DropDownButton
的ItemsSource
。
public List<TitledCommand> TitledCommmands { get; private set; }
现在我们只为DropDownButton
设置项容器的样式,这样它就可以从ItemsSource
中的对象中获取头和命令。
包括MahApps:
xmlns:metroControls="http://metro.mahapps.com/winfx/xaml/controls"
这是风格。。。
<metroControls:DropDownButton Content="Add" ItemsSource="{Binding Path=TitledCommmands}">
<metroControls:DropDownButton.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Path=Title}"/>
<Setter Property="Command" Value="{Binding Path=Command}"/>
</Style>
</metroControls:DropDownButton.ItemContainerStyle>
</metroControls:DropDownButton>
您可以覆盖控件的项模板,并可以在其中添加一个处理程序,如下所示:
<controls:DropDownButton Content="Select me" x:Name="selectMeDropDownButton">
<controls:DropDownButton.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" MouseDown="selectMeDropDownButton_TextBlock_MouseDown" />
</DataTemplate>
</controls:DropDownButton.ItemTemplate>
</controls:DropDownButton>
并在代码隐藏文件中实现事件处理程序,如下所示:
void selectMeDropDownButton_TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left && this.selectMeDropDownButton.IsExpanded)
{
var value = ((TextBlock)e.Source).DataContext;
// Do something meaningful with the value, it's an item from ItemsSource
}
}
DropDownButton.IsExpanded
的检查是必要的,因为相同的ItemTemplate
应用于按钮本身上的Content
。当然,您可以将TextBlock替换为任何您喜欢的Control
/UIElement
。
为ContextMenu/DropDownButton创建一个attached property
(根据您的喜好)。如果您进行了下拉,则获取它显示的上下文菜单,然后从中挂起Click
事件,并将值推回到属性中。
使用SplitButton而不是DropDownButton。第一个具有SelectionChanged事件。