第二天在解决这个问题。
为了重现问题,请创建一个新的 WPF 应用程序,xaml
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<Button Width="100" Height="100" MouseMove="Button_MouseMove"/>
<Popup x:Name="popup" StaysOpen="False" AllowsTransparency="True" Placement="Center">
<TextBlock>Some random text</TextBlock>
</Popup>
<CheckBox IsChecked="{Binding (Popup.IsOpen), ElementName=popup}">Popup</CheckBox>
</StackPanel>
以及代码
private void Button_MouseMove(object sender, MouseEventArgs e)
{
popup.IsOpen = true;
}
鼠标移至按钮以打开弹出窗口,单击其他位置以关闭。点击按钮会导致bug:弹出窗口的IsOpen == true(可以通过复选框或在处理程序中使用断点查看),但它是不可见的。
什么鬼?
而我的问题似乎是,设置 IsOpen
不是即时的。例如,当我尝试在 Popup
的 MouseMove
事件中将其设置为 false
时,我会在此期间立即触发 Button
的 MouseEnter
和 MouseMove
事件。
IsOpen = true;
与将其设置为
true
相同,有2个(!) MouseMove
事件发生,请将此行放入事件处理程序中以查看。System.Diagnostics.Trace.WriteLine("M");
在Visual Studio的输出窗口中会有2个 M,而
Popup
(当StayOpen=false
)应该捕获鼠标事件并且确实能够捕获,但不是立即。请问是否有人可以解释一下这是怎么回事?我希望在设置IsOpen
期间(或者稍后?如何检查是否正确?)不会发生任何事件。我已经尝试了许多方法:包括Dispatcher.InvokeAsync
、变量、计时器等。
Popup
应该保持打开状态还是关闭也可以? - icebat