gpt4 book ai didi

c# - 隐形打开的弹出窗口

转载 作者:太空狗 更新时间:2023-10-29 23:07:27 25 4
gpt4 key购买 nike

第二天解决这个问题。

要重现,创建新的 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:popup是IsOpen == true(可以在checkbox上看到或者在handler中有断点),而它是不可见的。

什么鬼?

我原来的问题是,似乎设置IsOpen 不是即时的。例如,当我尝试在 PopupMouseMove 事件中将其设置为 false 时,我得到了 MouseEnter MouseMove 事件 Button 在此期间触发

IsOpen = true;

与将它设置为true 一样,有 2 (!) 个 MouseMove 事件发生,将此行放入事件处理程序中以查看它

System.Diagnostics.Trace.WriteLine("M");

VS的Output窗口中会有2M,而Popup(当StayOpen=false时)假设捕获鼠标事件和会,但不会立即

谁能给我解释一下这是怎么回事?我不希望在期间(或之后不久?如何检查这是否为真?)设置 IsOpen 发生任何事件。已经尝试了很多东西:Dispatcher.InvokeAsync、变量、计时器等。

最佳答案

我认为您的异步假设是正确的。在失去焦点期间,IsOpen 的值被设置为 false,但是按钮的 MouseMove 触发再次将其设置为打开。然后内部的一些奇怪的魔法会破坏代码。

根据您的需要,我发现了 2 种可能的解决方案:

  1. 在弹出窗口关闭后将 IsOpen 显式设置为 false(bash 异步)
  2. #1 + 在弹出窗口期间禁用按钮 IsOpen == true

第一种方法将在单击按钮时隐藏弹出窗口。第二种方法会伴随轻微的闪烁 - 当快速单击按钮时 - 但它会保持弹出窗口打开:

对于第一种方法,使用以下事件处理程序(您可能不会先检查属性):

private void Button_MouseMove(object sender, MouseEventArgs e)
{
popup.IsOpen = true;
}

private void Popup_OnClosed(object sender, EventArgs e)
{
if (popup.IsOpen)
popup.IsOpen = false;
}

对于第二种方法,使用 BoolInvertConverter 并将其以一种方式绑定(bind)到弹出窗口:

IsEnabled="{Binding (Popup.IsOpen), ElementName=popup, Converter={StaticResource BoolInvertConverter}, Mode=OneWay}"

关于c# - 隐形打开的弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24491382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com