1

ボタンの下に 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;
}
4

1 に答える 1

0

水平方向に中央揃えして をContextMenu下に配置するButton場合は、 を にバインドしVerticalOffset、目的ContextMenuの垂直オフセットを計算するActualHeightを使用する必要があります。の高さをConverter渡して、より一般的にすることができます。ButtonConverterParameter

    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 からこのバインドを設定することもできます (私の意見ではそうすべきです)。

于 2013-06-04T17:42:28.503 に答える