Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# 如何在WPF中设置弹出控件自动隐藏?_C#_Wpf_Popup - Fatal编程技术网

C# 如何在WPF中设置弹出控件自动隐藏?

C# 如何在WPF中设置弹出控件自动隐藏?,c#,wpf,popup,C#,Wpf,Popup,如图所示,当鼠标进入ButtonOne按钮时,我希望显示“one”弹出控件。当我将鼠标从ButtonOne移动到ButtonTwo时,“One”弹出控件将隐藏,“Two”将显示。当鼠标不在按钮或弹出窗口上方时,弹出控件将自动隐藏 我尝试过使用鼠标进入和鼠标离开事件,但是当鼠标在按钮上移动时,弹出控件会闪烁。当鼠标不在按钮或弹出控件上方时,弹出控件不会隐藏 那么,如何解决这个问题呢 XAML: 最好使用StaysOpen=“False”这样,当焦点丢失时,弹出窗口将自动关闭。您可以像下面这样使用

如图所示,当鼠标进入ButtonOne按钮时,我希望显示“one”弹出控件。当我将鼠标从ButtonOne移动到ButtonTwo时,“One”弹出控件将隐藏,“Two”将显示。当鼠标不在按钮或弹出窗口上方时,弹出控件将自动隐藏

我尝试过使用鼠标进入和鼠标离开事件,但是当鼠标在按钮上移动时,弹出控件会闪烁。当鼠标不在按钮或弹出控件上方时,弹出控件不会隐藏

那么,如何解决这个问题呢

XAML:


最好使用
StaysOpen=“False”
这样,当焦点丢失时,弹出窗口将自动关闭。您可以像下面这样使用

<Popup x:Name="myPopUp" StaysOpen="False">

如果将
Pop1
StaysOpen
属性设置为
False
,则弹出窗口打开时,将触发
MouseLeave
事件
buttone
,即使鼠标仍在按钮上方。之后,当弹出窗口仍处于打开状态时,您的按钮将不再触发
MouseEnter
MouseLeave
事件。这是因为当
StaysOpen
为false时,
Popup
控件截取所有鼠标和键盘事件,以确定其中一个事件何时发生在Popup控件之外

因此,您可以将弹出窗口的
StaysOpen
属性设置为
True

<Popup Name="Pop1" StaysOpen="True" ...
<Popup Name="Pop2" StaysOpen="True" ...
通过检查离开位置,我们仅在鼠标通过弹出位置以外的其他位置离开按钮时关闭弹出窗口(在本例中,该位置位于按钮的右侧)。换句话说,在这种情况下,当鼠标从顶部、左侧和底部离开按钮时,我们希望弹出窗口关闭,但如果鼠标从右侧离开按钮,我们希望弹出窗口保持打开

随后,我们可以对弹出窗口
MouseLeave
事件处理程序使用类似的逻辑:

private void Pop1_MouseLeave(object sender, MouseEventArgs e)
{
    Point leavePoint = e.GetPosition(ButtonOne);
    if (leavePoint.X > ButtonOne.ActualWidth)
    {
        Pop1.IsOpen = false;
    }
}

private void Pop2_MouseLeave(object sender, MouseEventArgs e)
{
    Point leavePoint = e.GetPosition(ButtonTwo);
    if (leavePoint.X > ButtonTwo.ActualWidth)
    {
        Pop2.IsOpen = false;
    }
}

使用.Visible属性和.Click事件?你能发布你的xaml吗?@im lucky即使属性StaysOpen设置为false,用户也需要单击其他地方以消失弹出窗口。用户在将鼠标从ButtonOne移动到ButtonTwo之前不能单击某个位置,并在返回之前单击某个位置。这很有效!真是太神奇了!我还有几个问题:1。为什么StaysOpen设置为False,弹出窗口打开时,ButtonOne的MouseLeave事件被触发?2.当鼠标移动事件检查位置时,为什么不闪烁?换句话说,当我在MouseLeave事件中刚刚设置IsOpen=false时,为什么弹出控件会闪烁?3.在ButtonOne\u MouseLeave和ButtonTow\u MouseLeave方法中,应该是leavePoint.X>ButtonOne.ActualWidth和leavePoint.X>ButtonTwo.ActualWidth?1。当
StaysOpen
为false时,
Popup
控件截取所有鼠标和键盘事件,以确定其中一个事件何时发生在Popup控件之外。因此,该按钮将丢失其鼠标捕获,从而触发
MouseLeave
事件。我猜弹出窗口之前闪烁是因为在
MouseEnter
MouseLeave
事件之间有一个循环,所以弹出窗口反复打开和关闭。此外,通过检查离开位置,我们仅在鼠标通过除弹出位置以外的其他位置离开按钮(在本例中位于按钮右侧)时关闭弹出窗口。换句话说,在这种情况下,当鼠标从顶部、左侧和底部离开按钮时,我们希望弹出窗口关闭,但如果鼠标从右侧离开按钮,我们希望弹出窗口保持打开。正如我在第2篇中所解释的,我想代码
leavePoint.X
是正确的。
<Popup Name="Pop1" StaysOpen="True" ...
<Popup Name="Pop2" StaysOpen="True" ...
private void ButtonOne_MouseLeave(object sender, MouseEventArgs e)
{
    Point leavePoint = e.GetPosition(ButtonOne);
    if (leavePoint.X < ButtonOne.ActualWidth)
    {
        Pop1.IsOpen = false;
    }
}

private void ButtonTwo_MouseLeave(object sender, MouseEventArgs e)
{
    Point leavePoint = e.GetPosition(ButtonTwo);
    if (leavePoint.X < ButtonTwo.ActualWidth)
    {
        Pop2.IsOpen = false;
    }
}
private void Pop1_MouseLeave(object sender, MouseEventArgs e)
{
    Point leavePoint = e.GetPosition(ButtonOne);
    if (leavePoint.X > ButtonOne.ActualWidth)
    {
        Pop1.IsOpen = false;
    }
}

private void Pop2_MouseLeave(object sender, MouseEventArgs e)
{
    Point leavePoint = e.GetPosition(ButtonTwo);
    if (leavePoint.X > ButtonTwo.ActualWidth)
    {
        Pop2.IsOpen = false;
    }
}