我有一个可见的网格,当我点击它外面时必须折叠。我解决了一半。
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);
}
答案 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
事件。