【发布时间】:2017-09-30 10:52:01
【问题描述】:
我做了一个小测试应用程序来说明我不明白的行为:2个按钮,如果鼠标进入左键,则会显示一个弹出窗口(有效),如果鼠标进入右键,弹出窗口应该立即消失(不起作用)。在我的实际应用程序中我没有按钮,仅在此示例中进行简单测试,因此鼠标移动很重要,不能使用按钮单击。
我看到的是以下行为:
- 如果弹出显示,鼠标右键输入(隐藏)根本没有反应,似乎弹出已经获得焦点,我必须在鼠标右键启用之前单击主窗口。设置 Popup.Focusable=false (XAML) 或在设置 Popup.Isopen=true 之后尝试将焦点放在网格(C# 代码)没有帮助。
- 一旦我尝试通过设置 Popup.IsOpen=false 来隐藏弹出窗口,弹出窗口就会保持可见并且不会消失。只有当我单击主窗口顶部栏时,或者当我悬停显示工具提示的最小化按钮时,弹出窗口才会突然消失。对多个 UI 元素调用 UpdateLayout() 没有帮助。
我想要以下内容:
- 显示弹出窗口后,隐藏按钮仍应在鼠标输入时做出反应。
- 设置 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");
}
}
}
【问题讨论】: