2015-02-22 8 views
1

Я столкнулся с действительно странным поведением (по крайней мере для меня) при использовании ContextMenu. Вот упрощенная XAML (MainWindow.xaml):Странное поведение ContextMenu: размещение «зеркальное отображение»

<Window x:Class="ContextMenuTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Width="500" 
     Height="300"> 
    <Button Content="Do this" Height="25" Width="80" ContextMenuService.Placement="Right"> 
    <Button.ContextMenu> 
     <ContextMenu> 
     <MenuItem Header="Do this" /> 
     <MenuItem Header="Do that" /> 
     </ContextMenu> 
    </Button.ContextMenu> 
    </Button> 
</Window> 

С этой XAML, ожидаемый результат правой кнопкой мыши на кнопке на это ContextMenu помещается справа от кнопки. Но результат:

http://i.stack.imgur.com/pSd0Q.png

Итак, ContextMenu странным образом помещен в оставил кнопки. Я также попытался установить имущество ContextMenuService.Placement на Left, Top, Bottom. И результат:

  • Left -> Контекстное помещается в правой кнопки.
  • Top -> ContextMenu находится в верхней части справа кнопки. (Не сверху- покинул)
  • Bottom -> Контекстное помещается в правой снизу- кнопки (не оставили снизу-)

Мне кажется, что система координат зеркальный (то есть начало координат системы находится в верхнем правом углу окна, а не слева вверху). Я вообще не знаю, почему. Мне нужна помощь, чтобы разместить ContextMenu в левом нижнем углу кнопки.

(приписка Этот пример проекта является такой же, как проект по умолчанию, созданный в Visual Studio 2013, за исключением MainWindow.xaml.)

ответ

0

ОК, я, наконец, (да, наконец) нашел решение. Проблема заключается в том, может быть изоморфна описанной здесь: WPF Handedness with Popups

Так что я написал поведение:

namespace Test { 
    public class WorkaroundForTheBugOfPopupBehavior : Behavior<FrameworkElement> { 
    private static readonly FieldInfo _menuDropAlignmentField; 

    static WorkaroundForTheBugOfContextMenuBehavior() { 
     _menuDropAlignmentField = typeof(SystemParameters).GetField("_menuDropAlignment", BindingFlags.NonPublic | BindingFlags.Static); 
     System.Diagnostics.Debug.Assert(_menuDropAlignmentField != null); 
     EnsureStandardPopupAlignment(); 
     SystemParameters.StaticPropertyChanged += OnStaticPropertyChanged; 
    } 

    private static void EnsureStandardPopupAlignment() { 
     if (SystemParameters.MenuDropAlignment && _menuDropAlignmentField != null) { 
     _menuDropAlignmentField.SetValue(null, false); 
     } 
    } 

    private static void OnStaticPropertyChanged(object sender, PropertyChangedEventArgs e) { 
     EnsureStandardPopupAlignment(); 
    } 
    } 
} 

... и прикрепили его к MainWindow:

<i:Interaction.Behaviors> 
    <local:WorkaroundForTheBugOfPopupBehavior /> 
    </i:Interaction.Behaviors> 

где:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:local="clr-namespace:Test" 

И проблема исчезла. Надеюсь, это поможет кому-то еще ...

Смежные вопросы