[英]WPF left-click ContextMenu doesn't dissaepear on second click
我為WPF按鈕實現了一種新行為,以通過單擊鼠標左鍵使用上下文菜單:
public class LeftClickContextMenuButtonBehavior : Behavior<Button>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.AddHandler(UIElement.MouseDownEvent, new RoutedEventHandler(AssociatedObject_MouseDown), true);
}
void AssociatedObject_MouseDown(object sender, RoutedEventArgs e)
{
Button source = sender as Button;
if (source != null && source.ContextMenu != null)
{
source.ContextMenu.PlacementTarget = source;
source.ContextMenu.Placement = PlacementMode.Bottom;
source.ContextMenu.IsOpen = !source.ContextMenu.IsOpen;
}
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.RemoveHandler(UIElement.MouseDownEvent, new RoutedEventHandler(AssociatedObject_MouseDown));
}
}
XAML:
<Button Content="Left ContextMenu test">
<i:Interaction.Behaviors>
<extensions:LeftClickContextMenuButtonBehavior />
</i:Interaction.Behaviors>
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="Item A" />
<MenuItem Header="Item B" />
</ContextMenu>
</Button.ContextMenu>
</Button>
它工作正常,但我有一個小問題-再次單擊按鈕(在上下文菜單仍處於打開狀態),菜單關閉並立即重新打開,但是預期的行為是關閉菜單source.ContextMenu.IsOpen = !source.ContextMenu.IsOpen;
。 因此,似乎在觸發MoseDown on按鈕之前,其他一些功能會關閉菜單。 如何避免呢?
我想我已經找到了解決方案:
<Button Content="Left ContextMenu test" IsHitTestVisible="{Binding ElementName=cm, Path=IsOpen, Mode=OneWay, Converter={StaticResource BoolInverter}}">
<i:Interaction.Behaviors>
<extensions:LeftClickContextMenuButtonBehavior />
</i:Interaction.Behaviors>
<Button.ContextMenu>
<ContextMenu x:Name="cm">
<MenuItem Header="Item A" />
<MenuItem Header="Item B" />
</ContextMenu>
</Button.ContextMenu>
</Button>
其中BoolInverterConverter定義為:
public class BoolInverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
return !(bool)value;
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
這樣,當您第二次單擊該按鈕時,不會被單擊,但是上下文菜單將關閉,因為它失去了焦點。
嘗試這個:
void AssociatedObject_MouseDown(object sender, RoutedEventArgs e)
{
e.handled = true; // handle the event
Button source = sender as Button;
//rest of the code ...
}
祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.