【问题标题】:WPF - Center ContextMenu under buttonWPF - 按钮下的中心 ContextMenu
【发布时间】:2013-06-04 15:03:33
【问题描述】:

我正在尝试将 ContextMenu 置于按钮下方。我正在尝试根据 ContextMenu 的高度设置 VerticalOffset 属性,以便无论项目数量如何,菜单的顶部始终位于同一位置。我似乎无法获得菜单的高度(可能是因为它还没有被绘制?)。我的代码如下,如何获取 ContextMenu 的高度?

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button PopUpButton = (sender as Button);
    PopUpButton.ContextMenu.IsEnabled = true;
    PopUpButton.ContextMenu.PlacementTarget = PopUpButton;
    PopUpButton.ContextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Center;
    PopUpButton.ContextMenu.VerticalOffset = ((PopUpButton.ContextMenu.Height / 2) + 25);
    PopUpButton.ContextMenu.IsOpen = true;
}

【问题讨论】:

    标签: wpf contextmenu


    【解决方案1】:

    如果您想水平居中并将ContextMenu 放置在Button 下,您必须将VerticalOffset 绑定到ContextMenuActualHeight 并使用Converter 来计算所需的垂直偏移。您可以将Button 的高度传递为ConverterParameter 以使其更通用。

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button PopUpButton = (sender as Button);
            PopUpButton.ContextMenu.IsEnabled = true;
            PopUpButton.ContextMenu.PlacementTarget = PopUpButton;
            PopUpButton.ContextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Center;
    
            Binding b = new Binding("ActualHeight")
            { 
                Source = PopUpButton.ContextMenu, 
                Converter = new HeightToOffsetConverter(), 
                ConverterParameter = PopUpButton.ActualHeight,
            };
    
            PopUpButton.ContextMenu.SetBinding(ContextMenu.VerticalOffsetProperty, b);
            PopUpButton.ContextMenu.IsOpen = true;
        }
    
        public class HeightToOffsetConverter : IValueConverter
        {
            public object Convert(object value, Type targetType,
                object parameter, CultureInfo culture)
            {
                double popupHeight = (double)value;
                double buttonHeight = (double)parameter;
    
                return popupHeight / 2 + buttonHeight / 2;
            }
    
            public object ConvertBack(object value, Type targetType,
                object parameter, CultureInfo culture)
            {
                return Binding.DoNothing;
            }
        }
    

    您也可以(我认为您应该)从 XAML 设置此绑定。

    【讨论】:

    • 感谢您的回复。将放置模式设置为底部确实会将 ContextMenu 移动到底部,但是它不在我的按钮下方居中。我需要将菜单置于按钮下方。为了使用 PlacementMode.Bottom,我需要知道 ContextMenu 的宽度才能正确居中。
    • 非常感谢你的工作就像一个魅力。我对 WPF 和绑定还很陌生,所以非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2013-02-21
    • 2013-03-31
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多