2013-06-04 3 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

수평으로 중앙과 아래 ContextMenu을 배치 할 경우 Button 원하는 수직 오프셋을 계산합니다 그 VerticalOffsetConverterContextMenuActualHeight 및 사용에 결합해야합니다. 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

대표 전화 주셔서 감사합니다. 배치 모드를 Bottom으로 설정하면 ContextMenu가 맨 아래로 이동하지만 내 단추의 중앙에 배치되지 않습니다. 단추 아래에 메뉴가 있어야합니다. PlacementMode.Bottom을 사용하려면 ContextMenu의 너비가 정확히 중앙에 오도록해야합니다. – user10001110101

+0

업데이트 된 게시물을 참조하십시오. –

+0

많은 덕분에 매력처럼 작동합니다. 저는 WPF와 바인딩에 익숙하지 않아 도움을 정말 감사드립니다. – user10001110101

관련 문제