2013-06-04 69 views
1

我正在嘗試將按鈕下的ContextMenu居中。我試圖根據ContextMenu的高度來設置VerticalOffset屬性,這樣無論項目的數量如何,菜單的頂部始終位於相同的位置。我似乎無法獲得菜單的高度(可能是因爲它尚未繪製?)。我的代碼如下,我怎樣才能獲得ContextMenu的高度?WPF - 按鈕下的中心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; 
} 

回答

0

如果你想水平居中和放置ContextMenuButton你必須綁定VerticalOffsetContextMenuActualHeight和使用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設置此綁定。

+0

感謝repsonse。將放置模式設置爲底部會將ContextMenu移動到底部,但它並不位於我的按鈕下方。我需要將菜單置於按鈕下方。爲了使用PlacementMode.Bottom,我需要知道ContextMenu的寬度才能正確對中。 – user10001110101

+0

請參閱更新後的帖子。 –

+0

非常感謝,像魅力工作。我對WPF和綁定相當陌生,所以我非常感謝他們的幫助。 – user10001110101