C# 检测全局点击UWP
我有一个可见的网格,当我在它外面单击时,它必须折叠。我解决了一半 MainPage.xaml代码: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
<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控件(如果您单击它的外部)?阅读其使用场景的备注。最后一件事是,使用弹出按钮,我可以在单击其外部时更改关闭动画?