3

我在 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>

在我用来显示和隐藏MouseEnterContextMenu的代码中: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当鼠标在按钮上时,我看到按钮下方,当鼠标离开按钮时,它隐藏起来。

但是当我单击按钮时出现异常

WindowsBase.dll 中出现“System.StackOverflowException”类型的未处理异常

问题是 -为什么鼠标点击会触发这个异常?我没有在 Click 事件上运行任何我的代码,但不点击就不会发生异常......

顺便说一句:如果我用例如替换按钮也会发生同样的Image情况,所以它似乎不是由特定控件引起的......

4

1 回答 1

-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. 您单击,弹出隐藏(上下文菜单的默认行为)
  3. 按钮获得焦点,再次显示弹出窗口

如果设置 ContextMenu 的“StaysOpen”属性会发生什么?如果您不再有这种行为,我的怀疑是正确的。

于 2012-12-16T13:51:53.190 回答