检测全局点击UWP

时间:2017-10-30 11:02:19

标签: c# 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格式运行的代码:

    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);
    }

2 个答案:

答案 0 :(得分:0)

按钮吞下PointerPressed事件,因此它无法到达执行事件处理程序OnPointerPressed的基础父级。

有一种方法可以将事件传递给父母,请参阅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事件,并在处理程序中将其事件参数的Handled属性设置为false。我的意思是,不需要使用 AddHandler 。试一试。

答案 1 :(得分:0)

据我所知,UWP是沙盒,我们不能使用WndProc方法接收Window事件消息。

  

特定的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事件。