2017-10-30 6 views
1

私はそれを外にクリックすると崩壊しなければならない目に見えるグリッドがあります。私は半分それを解決した。グローバルクリックを検出するUWP

MainPage.xamlをコード:

<StackPanel Width="400" VerticalAlignment="Center"> 
     <Button x:Name="btnOne" Content="Button One" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="30"/> 
     <Button x:Name="btnShowGrid" Content="Show Grid" Click="btnShowGrid_Click" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="30"/> 
     <Grid x:Name="ControlGrid" PointerEntered="ControlGrid_PointerEntered" PointerExited="ControlGrid_PointerExited" HorizontalAlignment="Center" Visibility="Visible" Background="LightGreen" Height="300" VerticalAlignment="Top" Width="300" Margin="30"/> 
</StackPanel> 

MainPage.xaml.csコード:

bool PointerInGrid = false; 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 
    protected override void OnPointerPressed(PointerRoutedEventArgs e) 
    { 
     base.OnPointerPressed(e); 
     if (!PointerInGrid) 
     { 
      ControlGrid.Visibility = Visibility.Collapsed; 
     } 
    } 
    private void btnShowGrid_Click(object sender, RoutedEventArgs e) 
    { 
     ControlGrid.Visibility = Visibility.Visible; 
    } 
    private void ControlGrid_PointerEntered(object sender, PointerRoutedEventArgs e) 
    { 
     PointerInGrid = true; 
    } 
    private void ControlGrid_PointerExited(object sender, PointerRoutedEventArgs e) 
    { 
     PointerInGrid = false; 
    } 

私はグリッドにクリックした場合、私は、グリッドをクリックし崩壊していけば、これは、表示されたままこれまでのところすべては問題ありませんが、btnOneをクリックするとグリッドが表示されたままになります。

グローバルクリックでグリッドを崩壊させることは可能ですか?

いつもありがとうございます。 Windowsフォームで動作します

コード:それはイベントハンドラOnPointerPressedが実行される基本的な親に到達することはできませんので、

const int WM_PARENTNOTIFY = 0x0210; 
    const int WM_LBUTTONDOWN = 0x0201; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    protected override void WndProc(ref Message m) 
    { 
     if (!DesignMode) 
     { 
      if (m.Msg == WM_PARENTNOTIFY) 
      { 
       if (m.WParam.ToInt32() == WM_LBUTTONDOWN) 
       { 
        MessageBox.Show("Clicked!"); 
       } 
      } 
     } 
     base.WndProc(ref m); 
    } 

答えて

0

PointerPressedイベントがボタンに飲み込まれます。

イベントを親に渡す方法は、this answerを参照してください。

あなたはページのコンストラクタ

public MainPage() 
{ 
    this.InitializeComponent(); 
    //...other code 

    //then add this line 
    this.btnOne.AddHandler(UIElement.PointerPressedEvent, 
     new PointerEventHandler((s, e) => { e.Handled = false; }), true); 
} 

考え直しでは、このようにそれを行うことができます。たぶん、あなただけbtnOneのPointerPressedイベントを処理し、ハンドラではfalseとしてそのイベント引数のHandledプロパティを設定することができます。 AddHandlerを使用する必要はありません。試してみる。

+0

btnOneは正しいです。しかし、私はクリックを傍受したかったのです。質問を、Windowsフォームで動作するコードスタックで更新して、達成したいことをよりよく理解してください。 – LightGreen

+0

親によって処理されなかった場合にイベントが親で発生し、次に子に渡されるメカニズムは、WPFのPreviewMouseDownイベントのように_event tunneling_と呼ばれ、常に親で最初に起動されます。しかし、UWPでは、トンネリングはサポートされていないようです。バブリングイベントのみがサポートされています。つまり、イベントは最初に子プロセスによって処理されます。私はあなたが提供したWinFormサンプルコードは、Win32のトンネリングに相当すると思います。 – kennyzx

+0

UWPのために、UserControlをクリックして閉じると、UserControlを閉じる方法がありますか? – LightGreen

0

私が知る限り、UWPはサンドボックス化されており、WndProcメソッドを使用してウィンドウイベントメッセージを受信することはできません。

特定のWindowsランタイムコントロールは、PointerPressed入力イベントに対してクラスベースの処理を行うことがあります。そのような場合、コントロールにはおそらくメソッドOnPointerPressedのオーバーライドがあります。通常、イベントはクラスハンドラーによって処理されたマークが付けられ、PointerPressedイベントは、そのコントロール上のユーザーコードハンドラーによる処理のために発生しません。たとえば、ButtonBaseにはPointerPressedを処理するクラス処理があり、代わりにClickが発生します。

詳細については、PointerPressedを参照してください。

Buttonをクリックすると、OnPointerPressedイベントは発生しません。

Buttonは、OnPointerPressedイベントを発生させたい場合は、Buttonクラスを継承したクラスを作成できます。このクラスでは、OnPointerPresseイベントを上書きできます。例えば

:ところで

class MyButton: Button 
{ 
    protected override void OnPointerPressed(PointerRoutedEventArgs e) 
    { 

    } 
} 

、我々はButtonクラスを継承したクラスでOnPointerPressedイベントを上書きする場合は、Clickイベントが解雇されることはありません。

関連する問題