根据这个页面,DropDownButton 使用 ContextMenu 来显示 ItemsSource。我们如何知道用户点击了什么?按钮上的 Click 事件不是针对菜单,而是针对按钮本身。我看不到其他事件。
4 回答
我遇到了这个问题,正在寻找相同的答案。我从来没有真正在网上找到任何东西,但我自己发现了这个解决方案。也许它会在未来帮助某人。
如前所述,DropDownButton
使用 aContextMenu
来显示其ItemsSource
. 基本上我正在寻找的是来自按钮的“类似菜单”的下拉菜单。例如,假设您有一个DropDownButton
“添加”。也许您想要 2 个选项,例如“添加新的”和“添加现有的”。所以这就是我所做的......
首先,我制作了一些对象来保存标题/内容和命令。
public class TitledCommand
{
public String Title { get; set; }
public ICommand Command { get; set; }
}
从理论上讲,您将有一个列表绑定ItemsSource
到DropDownButton
.
public List<TitledCommand> TitledCommmands { get; private set; }
现在我们只需为 的项目容器设置样式,DropDownButton
以便它从ItemsSource
.
包括 MahApp:
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
按钮本身。当然你可以用任何你喜欢的Control
/替换 TextBlock。UIElement
attached property
为 ContextMenu/DropDownButton创建一个(无论您喜欢哪个)。如果您做了下拉菜单,则获取它显示的上下文菜单,然后从中连接Click
事件并将值推回属性。
使用SplitButton而不是 DropDownButton。第一个有 SelectionChanged 事件。