在我的 WPF 应用程序中,我想在单击按钮时显示弹出窗口。
如果我在弹出窗口外部单击,我希望关闭弹出窗口。我可以通过在弹出窗口上设置
StaysOpen=False
来完成此操作。
但是当我在弹出窗口外部单击时,我希望 WPF 忽略关闭弹出窗口的初始单击。例如,如果我在弹出窗口外部单击另一个按钮,我不希望该按钮执行 click 方法。
如何让 WPF 在弹出窗口打开时忽略弹出窗口外部的点击?
这是一些示例代码。当我单击“弹出窗口”按钮时,弹出窗口打开,当我单击外部时,弹出窗口关闭。但我可以在弹出窗口打开时单击“PrintMessage”按钮,并且其单击事件将触发。我希望它的点击事件不要触发。
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Popup x:Key="pop" StaysOpen="False" Placement="MousePoint">
<UniformGrid Background="Red">
<Button>Btn1</Button>
<Button>Btn2</Button>
</UniformGrid>
</Popup>
</Window.Resources>
<UniformGrid>
<Button Click="Popup_Click">Popup</Button>
<Button Click="PrintMessage_Click">PrintMessage</Button>
</UniformGrid>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Popup_Click(object sender, RoutedEventArgs e)
{
Popup pop = (Popup)Resources["pop"];
pop.IsOpen = true;
}
private void PrintMessage_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Test");
}
}
我将向您展示最简单的,也许不是很干净的解决方案,但这只是为了给您提供对代码进行最少修改的想法。出于好奇,我实现了这个效果,但是……
但我的主要建议是:最好不要这样做。默认的弹出行为要好得多。你想要的并不是用户期望的。如果用户单击输入控件,则此人就是这个意思。用户的注意力集中在给定时刻单击的控件上,而不是弹出窗口上。您的弹出窗口是短暂的,因此,当它被隐藏时,这只不过是单击某些控件的副作用。如果您应用您的设计,您只会收到一些控件“并不总是响应式”的抱怨。
现在,一些实施。 XAML:
<Window x:Class="PopupClickProblem.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Popup x:Name="popup" StaysOpen="False" Placement="MousePoint">
<UniformGrid Background="Red">
<Button>Btn1</Button>
<Button>Btn2</Button>
</UniformGrid>
</Popup>
<UniformGrid>
<Button x:Name="buttonShowPopup">Popup</Button>
<Button x:Name="buttonPrintMessage">Print Message</Button>
</UniformGrid>
<Border x:Name="borderBlocker"
Background="Black" Opacity="0.15"
Visibility="Collapsed" />
</Grid>
</Window>
后台代码:
namespace PopupClickProblem {
using System.Windows;
using Debug = System.Diagnostics.Debug;
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
buttonShowPopup.Click += (sender, eventArgs) => {
popup.IsOpen = true;
borderBlocker.Visibility = Visibility.Visible;
};
buttonPrintMessage.Click += (sender, eventArgs) => {
Debug.WriteLine("Test");
};
popup.Closed += (sender, eventArgs) => {
borderBlocker.Visibility = Visibility.Collapsed;
};
} //MainWindow
} //class MainWindow }
请注意,我显示了半透明着色,您可以使用它来产生这样的印象:弹出窗口之外的所有窗口控件在第一次单击之前都被禁用。您可以选择使用或不使用此效果。
您想要更好的设计吗?如果您只禁用一个元素(我命名为
buttonShowPopup
的按钮)会怎样?单击弹出窗口外部后再次显示弹出窗口时,看起来确实很奇怪。您可以在弹出窗口显示时禁用此按钮,然后在 popup.Closed
上再次启用它,这应该足够了。