gpt4 book ai didi

c# - 将 MouseEnter/MouseLeave 事件与 ContextMenus 结合使用

转载 作者:行者123 更新时间:2023-11-30 22:16:22 25 4
gpt4 key购买 nike

我在 Button 上有一个 ContextMenu,我想在 MouseEnter 事件上打开它,而不是在默认的右侧-点击事件。这是我的 XAML:

<Button Content="Button" MouseEnter="Button_MouseEnter" MouseLeave="Button_MouseLeave">
<Button.ContextMenu>
<ContextMenu>
.... context menu items ....
</ContextMenu>
</Button.ContextMenu>
</Button>

以及关联的事件处理程序:

private void Button_MouseEnter(object sender, MouseEventArgs e)
{
backButtonContextMenu.Placement = PlacementMode.Bottom;
backButtonContextMenu.IsOpen = true;
Console.WriteLine("MouseEnter called");
}

private void Button_MouseLeave(object sender, MouseEventArgs e)
{
backButtonContextMenu.IsOpen = false;
Console.WriteLine("MouseLeave called");
}

非常简单。不幸的是,当鼠标悬停在按钮上时,这两个方法会被无限调用,来回交替。这是我的控制台中的输出示例:

MouseEnter called
MouseLeave called
MouseEnter called
MouseLeave called
MouseEnter called
MouseLeave called
MouseEnter called
MouseLeave called
... etc. ...

我假设这与 ContextMenu 在打开时窃取焦点有关,或者可能放置某种不可见的“助手”背景以检测何时需要关闭。有没有人对这种行为有解释,有没有办法避免这种情况?从 UI 的角度来看,这是一个非常简单的效果。

最佳答案

ContextMenu 被调用时,它进入一个循环 cos Button 松开鼠标,然后关闭 ContextMenu,现在鼠标悬停再次返回到 Button 并且您得到了循环。

你可以去:

private void Button_MouseLeave(object sender, MouseEventArgs e) {
if (backButtonContextMenu.IsMouseOver)
return;
backButtonContextMenu.IsOpen = false;
Debug.WriteLine("MouseLeave called");
}

但是现在您遇到了必须在另一时刻关闭菜单的问题。

在这种情况下,当我需要像 ContextMenu 这样的菜单但不是默认行为时,我倾向于选择 Popup

Popup 说同样的话:

<StackPanel>
<Button x:Name="button"
Content="Button" />
<Button x:Name="button2"
Content="Button 2" />
<Popup Placement="Right"
PlacementTarget="{Binding ElementName=button}">
<Menu>
<MenuItem Header="AAA" />
</Menu>
<Popup.Style>
<Style TargetType="{x:Type Popup}">
<Setter Property="IsOpen"
Value="True" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self},
Path=PlacementTarget.IsMouseOver}"
Value="False" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self},
Path=IsMouseOver}"
Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="IsOpen"
Value="False" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Popup.Style>
</Popup>
</StackPanel>

您可以根据需要调整条件。

关于c# - 将 MouseEnter/MouseLeave 事件与 ContextMenus 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17452937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com