我在WPF中遇到了一个奇怪的行为。尽管有很多方法可以避免这个问题,但我正在努力更好地理解为什么它正在发生:
我创建了一个新的WPF应用程序,只添加了一个具有ContextMenu
:
<Grid>
<Button x:Name="btnTest" Margin="10,10,10,10"
MouseEnter="BtnTest_OnMouseEnter" MouseLeave="BtnTest_OnMouseLeave">
<Button.ContextMenu>
<ContextMenu x:Name="myContext">
<TextBlock Text="Context Menu Text"></TextBlock>
</ContextMenu>
</Button.ContextMenu>
</Button>
</Grid>
在后面的代码中,我使用MouseEnter
来显示ContextMenu,并MouseLeave
隐藏它:
private void BtnTest_OnMouseEnter(object sender, MouseEventArgs e)
{
myContext.PlacementTarget = btnTest;
myContext.Placement = PlacementMode.Bottom;
myContext.IsOpen = true;
}
private void BtnTest_OnMouseLeave(object sender, MouseEventArgs e)
{
myContext.IsOpen = false;
}
所以现在 - 当鼠标在按钮上时,我看到按钮下方的ContextMenu
,当鼠标离开按钮时,它会隐藏。
但是当我 点击按钮 时出现异常
类型'System.StackOverflowException'的未处理异常 发生在WindowsBase.dll
中
问题是 - 为什么是鼠标单击,特别是触发此异常?我没有在Click事件上运行任何代码,但没有点击异常就不会发生...
BTW:如果我用例如Image
替换Button,也会发生同样的情况,因此它似乎不是由特定控件引起的......
答案 0 :(得分:-1)
像这样更改您的XAML:
<Grid>
<Popup x:Name="myContext">
<TextBlock Text="Context Menu Text"></TextBlock>
</Popup>
<Button x:Name="btnTest" Margin="10,10,10,10"
MouseEnter="BtnTest_OnMouseEnter" MouseLeave="BtnTest_OnMouseLeave">
</Button>
</Grid>
我认为你的代码中存在这种循环:
如果设置ContextMenu的'StaysOpen'属性会怎样?如果你不再这种行为,我的怀疑是正确的。