Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测全局点击UWP_C#_Uwp - Fatal编程技术网

C# 检测全局点击UWP

C# 检测全局点击UWP,c#,uwp,C#,Uwp,我有一个可见的网格,当我在它外面单击时,它必须折叠。我解决了一半 MainPage.xaml代码: <StackPanel Width="400" VerticalAlignment="Center"> <Button x:Name="btnOne" Content="Button One" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="30"/> <Butt

我有一个可见的网格,当我在它外面单击时,它必须折叠。我解决了一半

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>
如果我点击进入网格,它将保持可见,如果我点击退出,网格将崩溃,到目前为止一切正常,但是,如果我点击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);
    }

PointerPressed
事件被按钮吞没,因此它无法到达执行事件处理程序
OnPointerPressed
的底层父级

有一种技术可以将事件传递给家长,请参阅

您可以这样做,在页面的构造函数中

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。试试看。

按钮会吞没
PointerPressed
事件,因此它无法到达执行事件处理程序
OnPointerPressed
的底层父级

有一种技术可以将事件传递给家长,请参阅

您可以这样做,在页面的构造函数中

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。试试看。

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

特定Windows运行时控件可能对PointerPressed输入事件具有基于类的处理。如果是这样,控件可能对OnPointerPressed方法具有重写。通常,事件标记为由类处理程序处理,并且不会引发PointerPressed事件以供该控件上的任何用户代码处理程序处理。例如,ButtonBase具有处理指针压缩的类处理,而不是激发Click

有关更多信息,请参阅

单击
按钮
时,将不会触发
OnPointerPressed
事件

如果希望
按钮
可以触发
OnPointerPressed
事件,可以创建继承
按钮
类的类。在类中,可以重写
OnPointerPresse
事件

例如:

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

    }
}

顺便说一下,如果我们在继承了
按钮
类的类中重写OnPointerPressed事件,则不会触发
单击
事件

据我所知,UWP是沙盒的,我们不能使用
WndProc
方法来接收窗口事件消息

特定Windows运行时控件可能对PointerPressed输入事件具有基于类的处理。如果是这样,控件可能对OnPointerPressed方法具有重写。通常,事件标记为由类处理程序处理,并且不会引发PointerPressed事件以供该控件上的任何用户代码处理程序处理。例如,ButtonBase具有处理指针压缩的类处理,而不是激发Click

有关更多信息,请参阅

单击
按钮
时,将不会触发
OnPointerPressed
事件

如果希望
按钮
可以触发
OnPointerPressed
事件,可以创建继承
按钮
类的类。在类中,可以重写
OnPointerPresse
事件

例如:

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

    }
}

顺便说一下,如果我们在继承了
按钮
类的类中重写OnPointerPressed事件,则不会触发
单击
事件

因为没有人是对的。但我想拦截任何点击。我用一个在windows窗体中工作的代码堆栈来更新这个问题,以便更好地理解我想要实现的目标。这种机制称为事件隧道,即在父级中触发事件,然后在不由父级处理的情况下传递给子级,就像WPF中的PreviewMouseDown事件一样,总是首先在父级中触发。但在UWP中,似乎不支持隧道,只支持冒泡事件,即事件首先由子级处理。我认为您提供的WinFrm示例代码是Win32等效的隧道。因此,对于UWP,有一种方法可以关闭USER控件(如果您单击它的外部)?阅读其使用场景的备注。最后一件事是,使用弹出按钮,我可以在单击其外部时更改关闭动画?因为btnOne是正确的。但我想拦截任何点击。我用一个在windows窗体中工作的代码堆栈来更新这个问题,以便更好地理解我想要实现的目标。这种机制称为事件隧道,即在父级中触发事件,然后在不由父级处理的情况下传递给子级,就像WPF中的PreviewMouseDown事件一样,总是首先在父级中触发。但在UWP中,似乎不支持隧道,只支持冒泡事件,即事件首先由子级处理。我认为您提供的WinFrm示例代码是Win32等效的隧道。因此,对于UWP,有一种方法可以关闭USER控件(如果您单击它的外部)?阅读其使用场景的备注。最后一件事是,使用弹出按钮,我可以在单击其外部时更改关闭动画?