尝试显示ContextMenu并单击其父级时出现StackOverflowException

时间:2012-12-16 13:49:48

标签: c# wpf contextmenu stack-overflow

我在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,也会发生同样的情况,因此它似乎不是由特定控件引起的......

1 个答案:

答案 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>

我认为你的代码中存在这种循环:

  1. 您输入按钮,弹出窗口显示
  2. 点击,弹出隐藏(contextmenu的默认行为)
  3. 按钮获得焦点,弹出窗口再次显示
  4. 如果设置ContextMenu的'StaysOpen'属性会怎样?如果你不再这种行为,我的怀疑是正确的。