2016-06-17 25 views
2

標準のWPF ComboBoxコントロールを使用します。ポップアップが開かれ、ユーザーが外側をクリックすると、ポップアップが閉じられます。しかし、ウィンドウにボタンがあり、ユーザーがそれをクリックすると(ポップアップがまだ開いている状態で)、ボタンのクリックハンドラーは実行されません。ポップアップは閉じられていますが、ユーザーはボタンをクリックしてクリックイベントを発生させる必要があります。WPF ComboBox:ポップアップの外側をクリックします。

このコントロールの標準的な動作です。この問題を回避する方法はありますか?ありがとう!

+0

私はそうではありません。ポップアップが閉じられた後、ボタンクリックイベントが発生します。 – AnjumSKhan

+0

あなたはWPFを使用していますか?スタンダードコントロール? .netフレームワークのバージョンは何ですか? –

答えて

1

あなたが作成することができますComboBox DropDownClosedおよびhittest関数のイベントは、ユーザーがクリックした他のコントロールを検索します。

private void ComboBox_DropDownClosed(object sender, EventArgs e) 
{ 
    Point m = Mouse.GetPosition(this); 
    VisualTreeHelper.HitTest(this, this.FilterCallback, this.ResultCallback, new PointHitTestParameters(m)); 
} 

private HitTestFilterBehavior FilterCallback(DependencyObject o) 
{ 
    var c = o as Control; 
    if ((c != null) && !(o is MainWindow)) 
    { 
     if (c.Focusable) 
     { 
      if (c is ComboBox) 
      { 
       (c as ComboBox).IsDropDownOpen = true; 
      } 
      else 
      { 
       var mouseDevice = Mouse.PrimaryDevice; 
       var mouseButtonEventArgs = new MouseButtonEventArgs(mouseDevice, 0, MouseButton.Left) 
       { 
        RoutedEvent = Mouse.MouseDownEvent, 
        Source = c 
       }; 
       c.RaiseEvent(mouseButtonEventArgs); 
      } 

      return HitTestFilterBehavior.Stop; 
     } 
    } 
    return HitTestFilterBehavior.Continue; 
} 

private HitTestResultBehavior ResultCallback(HitTestResult r) 
{ 
    return HitTestResultBehavior.Continue; 
} 

コントロールを見つけた後にFilterCallback関数で、そのコントロールのマウスダウンイベントを発生させます。

raiseイベントが見つかりましたが、コンボボックスでは機能しません。クリックすると、単にIsDropDownOpenがtrueに設定されます。

hereにコードがあります。少し修正しました。

0

あなたは、コンボボックスが1を取得した直後にマウスキャプチャを解放しようとすることができます:XAMLであなたのコンボボックスのプロパティで :

GotMouseCapture="ComboBox_OnGotMouseCapture" 

そして、コードビハインドで:

private void ComboBox_OnGotMouseCapture(object sender, MouseEventArgs e) 
{ 
    ComboBox.ReleaseMouseCapture(); 
} 
関連する問題