【问题标题】:WPF contextmenu binding works on right-click but not on left-clickWPF 上下文菜单绑定适用于右键单击但不适用于左键单击
【发布时间】:2014-05-15 10:53:08
【问题描述】:

我有以下在 wpf 中定义上下文菜单的 xaml:

<Grid Name="grid">
    <Button x:Name="settingsButton" DockPanel.Dock="Left" Content="Settings" Click="SettingsButtonClicked">
        <Button.ContextMenu>
            <ContextMenu>
                <MenuItem Header ="Column Chooser">
                    <MenuItem IsCheckable="true" Header="A" IsChecked="{Binding Path=IsAChoosen}"></MenuItem>
                    <MenuItem IsCheckable="true" Header="B" IsChecked="{Binding Path=IsBChoosen}"></MenuItem>
                    <MenuItem IsCheckable="true" Header="C" IsChecked="{Binding Path=IsCChoosen}"></MenuItem>
                </MenuItem>
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
</Grid>

如果我通过右键单击正常调出上下文菜单,则绑定可以正常工作。

但是,我希望在我左键单击按钮而不是右键单击时显示上下文菜单。所以我有以下代码来做到这一点:

public partial class SettingsView : UserControl
{
    public SettingsView()
    {
        InitializeComponent();
        settingsButton.MouseRightButtonDown += SettingsButtonOnMouseRightButtonDown;
    }

    private void SettingsButtonOnMouseRightButtonDown(object sender, MouseButtonEventArgs mouseButtonEventArgs)
    {
        settingsButton.ContextMenu.Visibility = Visibility.Hidden;
    }

    private void SettingsButtonClicked(object sender, RoutedEventArgs e)
    {
        settingsButton.ContextMenu.Visibility = Visibility.Visible;
        settingsButton.ContextMenu.PlacementTarget = sender as Image;
        settingsButton.ContextMenu.IsOpen = true;
    }
}

当我这样做时,绑定不起作用。任何人都知道为什么它可以通过右键单击而不是当我强制它单击左键时?

【问题讨论】:

  • 可能是因为您将 PlacementTarget 设置为 null。 sender 将是 Button 类型,而不是 Image

标签: c# wpf xaml


【解决方案1】:

将 PlacementTarget 设置为按钮而不是 Image

private void SettingsButtonClicked(object sender, RoutedEventArgs e)
{
    settingsButton.ContextMenu.Visibility = Visibility.Visible;
    settingsButton.ContextMenu.PlacementTarget = sender as Button;
    settingsButton.ContextMenu.IsOpen = true;
}

【讨论】:

  • 谢谢,辛苦了。我设法通过执行 settingsButton.ContextMenu.DataContext = DataContext; 让它工作但我认为您的解决方案要好得多。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多