3

フライアウト パネルを含むユーザー コントロールを作成しています。

ボタンをクリックしてパネルを開くと、ユーザーがフライアウトパネルをクリックして閉じることができるように、マウスをキャプチャしようとしています。

しかし、マウスをキャプチャした直後に、失われた mousecapture イベントが発生し、パネルの外側でクリックを検出できません。

ここで、まっすぐ開いて閉じるクリックを検出します

private void Grid_MouseUP(object sender, MouseButtonEventArgs e)
{
if (indicatorVM != null)
{
    if (indicatorVM.SettingsFlyoutVisibility == Visibility.Collapsed)
    {
        doRelease = false;
        indicatorVM.SettingsFlyoutVisibility = Visibility.Visible;
        bool result = this.CaptureMouse();
        result = Mouse.Capture(this, CaptureMode.SubTree);
    }
    else
    {
        doRelease = true;
        indicatorVM.SettingsFlyoutVisibility = Visibility.Collapsed;
        this.ReleaseMouseCapture();
    }
}

}

キャプチャ ロスト イベントに配線すると、フライアウトが開いた直後にヒットします。結果変数を確認すると、マウスのキャプチャ方法に関係なく、結果は true であるため、正しく機能しているように見えます。

何か案は?

4

1 に答える 1

2

まず、indicatorVM の可視性を Visible に設定した直後、マウスをキャプチャする前に UpdateLayout を試してください。これにより、マウスをキャプチャした後にレイアウトが変更されるのを回避できます。これはおそらく、キャプチャを盗んでいる原因です。2 番目の提案は、次のように Dispatcher Invoke でキャプチャを少し延期することです。

Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate()
{
    bool result = this.CaptureMouse();
    result = Mouse.Capture(this, CaptureMode.SubTree);
 });

キャプチャは、レイアウトの結果の後に行われます。

于 2011-07-28T22:23:12.973 に答える