2011-07-16 3 views
3

私はフライアウトパネルを含むユーザーコントロールを構築しています。wpf 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(); 
    } 
} 

} 

ストレートオープンクローズクリックを検出するのはここ

がある、キャプチャに私のワイヤーがイベントを失った場合は、フライアウトが開いた後、それはすぐにヒットです。マウスをどのようにキャプチャするかにかかわらず結果変数をチェックすると、結果は真であるため、正しく動作しているように見えます。

アイデア?

答えて

1

まず、マウスをキャプチャする前に、indicatorVMの可視性をVisibleに設定した直後にUpdateLayoutを試してください。これにより、マウスをキャプチャした後にレイアウトが変更されるのを避けることができます。これはおそらくキャプチャを盗むものです。

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

キャプチャはその後、レイアウト結果の後に次のようになります。私の第二の提案は、このように、少しディスパッチャ起動してキャプチャを延期することです。

+0

BeginInvokeでマウスキャプチャを延期すると私にとってうまくいった。 –

関連する問題