WPF 忽略弹出窗口之外的点击

问题描述 投票:0回答:1

在我的 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");
    }
}
c# wpf popup
1个回答
0
投票

我将向您展示最简单的,也许不是很干净的解决方案,但这只是为了给您提供对代码进行最少修改的想法。出于好奇,我实现了这个效果,但是……

但我的主要建议是:最好不要这样做。默认的弹出行为要好得多。你想要的并不是用户期望的。如果用户单击输入控件,则此人就是这个意思。用户的注意力集中在给定时刻单击的控件上,而不是弹出窗口上。您的弹出窗口是短暂的,因此,当它被隐藏时,这只不过是单击某些控件的副作用。如果您应用您的设计,您只会收到一些控件“并不总是响应式”的抱怨。

现在,一些实施。 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
上再次启用它,这应该足够了。

© www.soinside.com 2019 - 2024. All rights reserved.