【问题标题】:Several problems with Popup (does not hide)Popup 的几个问题(不隐藏)
【发布时间】:2017-09-30 10:52:01
【问题描述】:

我做了一个小测试应用程序来说明我不明白的行为:2个按钮,如果鼠标进入左键,则会显示一个弹出窗口(有效),如果鼠标进入右键,弹出窗口应该立即消失(不起作用)。在我的实际应用程序中我没有按钮,仅在此示例中进行简单测试,因此鼠标移动很重要,不能使用按钮单击。

我看到的是以下行为:

  • 如果弹出显示,鼠标右键输入(隐藏)根本没有反应,似乎弹出已经获得焦点,我必须在鼠标右键启用之前单击主窗口。设置 Popup.Focusable=false (XAML) 或在设置 Popup.Isopen=true 之后尝试将焦点放在网格(C# 代码)没有帮助。
  • 一旦我尝试通过设置 Popup.IsOpen=false 来隐藏弹出窗口,弹出窗口就会保持可见并且不会消失。只有当我单击主窗口顶部栏时,或者当我悬停显示工具提示的最小化按钮时,弹出窗口才会突然消失。对多个 UI 元素调用 UpdateLayout() 没有帮助。

我想要以下内容:

  1. 显示弹出窗口后,隐藏按钮仍应在鼠标输入时做出反应。
  2. 设置 Popup.IsOpen=false 应该直接让弹窗消失。

参见下面的代码,XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    mc:Ignorable="d"
    x:Name="MyWindow"
    Title="MainWindow" Height="500" Width="800">
<Grid>
    <Grid x:Name="MyGrid" Margin="100" Background="Green">

        <TextBox x:Name="MyText" Width="100" Height="50" Margin="0,50" HorizontalAlignment="Center"></TextBox>

        <Button Width="75" Height="50" Margin="20,100" HorizontalAlignment="Left"
                Content="Show" MouseEnter="MouseEnterShow"></Button>
        <Button Width="75" Height="50" Margin="20,100" HorizontalAlignment="Right"
                Content="Hide" MouseEnter="MouseEnterHide"></Button>

        <Popup x:Name="MyPopup" PlacementTarget="{Binding ElementName=MyGrid}" Placement="RelativePoint"
               AllowsTransparency="false" IsOpen="False" StaysOpen="False"
               Focusable="False"
               Width="200" Height="200"                   
               HorizontalAlignment="Left" VerticalAlignment="Top"
               HorizontalOffset="-50" VerticalOffset="-50">
            <Grid>
                <Canvas Background="BlanchedAlmond" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Canvas>
            </Grid>
        </Popup>
    </Grid>
</Grid>
</Window>

和 C#:

using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void MouseEnterShow(object sender, MouseEventArgs e)
    {
        MyPopup.IsOpen = true;
        MyGrid.Focus();// Does not help

        MyText.Text    = "Show";
        System.Diagnostics.Debug.WriteLine("Show");
    }

    private void MouseEnterHide(object sender, MouseEventArgs e)
    {
        MyPopup.IsOpen = false;
        MyGrid.UpdateLayout();// Does not help

        MyText.Text    = "Hide";
        System.Diagnostics.Debug.WriteLine("Hide");
    }
}
}   

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    经过一些暴力破解,我设法使它工作:

    1.将Popup属性StaysOpen设置为true,而不是false

    2.后面的代码

    private void MouseEnterShow(object sender, MouseEventArgs e)
    {
        MyPopup.IsOpen = true;
    }
    
    private void MouseEnterHide(object sender, MouseEventArgs e)
    {
        MyPopup.IsOpen = false;
    }
    

    【讨论】:

    • 这是一个进步,谢谢。当显示弹出窗口时,隐藏按钮上的鼠标输入现在确实响应,但由于某种原因,在“Popup.IsOpen = false”之后,弹出窗口仍然保持可见,直到我单击主窗口顶部栏或悬停最小化按钮。奇怪...
    • 现在似乎可以工作了,一旦我设置了“AllowsTransparency="true"”。但我不明白这背后的理由......
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2021-04-27
    相关资源
    最近更新 更多