12

根据这个页面,DropDownButton 使用 ContextMenu 来显示 ItemsSource。我们如何知道用户点击了什么?按钮上的 Click 事件不是针对菜单,而是针对按钮本身。我看不到其他事件。

4

4 回答 4

15

我遇到了这个问题,正在寻找相同的答案。我从来没有真正在网上找到任何东西,但我自己发现了这个解决方案。也许它会在未来帮助某人。

如前所述,DropDownButton使用 aContextMenu来显示其ItemsSource. 基本上我正在寻找的是来自按钮的“类似菜单”的下拉菜单。例如,假设您有一个DropDownButton“添加”。也许您想要 2 个选项,例如“添加新的”和“添加现有的”。所以这就是我所做的......

首先,我制作了一些对象来保存标题/内容和命令。

public class TitledCommand
{
    public String Title { get; set; }
    public ICommand Command { get; set; }
}

从理论上讲,您将有一个列表绑定ItemsSourceDropDownButton.

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>
于 2015-02-16T00:45:02.537 回答
3

您可以覆盖控件的项目模板,并可以在其中添加一个处理程序,如下所示:

<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

于 2014-11-05T10:08:11.337 回答
0

attached property为 ContextMenu/DropDownButton创建一个(无论您喜欢哪个)。如果您做了下拉菜单,则获取它显示的上下文菜单,然后从中连接Click事件并将值推回属性。

于 2014-04-11T18:10:35.050 回答
0

使用SplitButton而不是 DropDownButton。第一个有 SelectionChanged 事件。

于 2015-07-15T16:01:37.193 回答