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>

コード ビハインドでは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イベントで実行しているコードはありませんが、クリックしないと例外は発生しません...

ところで:ボタンをたとえばに置き換えても同じことが起こる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 に答える