【问题标题】:WPF Popup is closing immediately when using StaysOpen使用 StaysOpen 时 WPF 弹出窗口立即关闭
【发布时间】:2020-05-24 17:33:18
【问题描述】:

我定义了一个弹出窗口:

<Popup StaysOpen="False" IsOpen="{Binding IsOpen, Mode=TwoWay}" />

我将弹出窗口的IsOpen 属性绑定到视图模型中的IsOpen 属性。

将其设置为true 可以按预期工作并显示弹出窗口(当我在调试时单步执行代码时)。我在按钮的命令事件处理程序中将其设置为true,如下所示:

<Button Command="{Binding OpenPopupCommand}" />

命令只是执行以下代码(它在我的视图模型中):

IsOpen = true;

现在奇怪的是:

在打开弹出窗口后,IsOpen 属性设置器上的断点被值 false 命中,这导致弹出窗口立即关闭。

如果我删除 StaysOpen="False"(然后默认为 True),则不会发生这种情况。

就像弹出窗口正在显示,但它没有获得/失去焦点并关闭。

但我不明白为什么?

【问题讨论】:

  • 让我确定我理解:您将一个值设置为 false,然后想知道它设置为 false 并对设置为 false 的值做出反应?
  • @Christopher 不,我没有将其设置为 false,这就是重点 - 在“WPF 系统”中的某处,它被设置为 false,这是由于 StaysOpen="False"

标签: c# wpf xaml mvvm popup


【解决方案1】:

Popup.StaysOpen 属性:

获取或设置一个值,该值指示当控件不再处于焦点时是否关闭 Popup 控件。

如果当 IsOpen 属性设置为 false 时 Popup 控件关闭,则为 true; 如果 Popup 控件在 Popup 控件之外发生鼠标或键盘事件时关闭,则为 false。默认为真。

当您将此值设置为 false 时,一旦“在 Popup 控件之外发生鼠标或键盘事件”,它将关闭。对于人类做出的微小的、不可避免的鼠标移动,您应该立即获得“MouseMoved”事件,除非鼠标在弹出窗口出现时恰好位于弹出窗口上方。

当您将 StaysOpen 设置为 false 时,IsOpen 的值也会被忽略。

【讨论】:

  • 对...除了在弹出窗口外点击之外没有想到其他许多事件...仔细阅读文档的课程:)
  • @MichałTurczyn “体验非常棒。不幸的是,您只有在需要它之后才能获得它。” - 我的一个老朋友。
  • 另一个,希望是快速的问题:我在那个弹出窗口上有按钮,我必须点击两次,才能真正触发它的命令。就像弹出窗口正在成为焦点,首先我必须单击一下“取消焦点”弹出窗口,然后我才能单击我的按钮。
  • @MichałTurczyn 我知道 Checkbox 和 DataGrid 之一的类似行为。 IIRC DataGrid 元素“吃掉”了 Click 事件,只是将焦点放在了复选框上。我不记得解决了什么问题。最好你问一个单独的问题,因为这涉及我现在不知道的 WPF 细节。
  • 好吧,事实证明,删除处理焦点事件的事件处理程序解决了这个问题,但我对此非常不确定......我用弹出窗口创建了新的项目,它按预期工作。很可能是昨天我用很多“测试代码”使我的主要项目变得臃肿,它开始表现得很奇怪......感谢支持。
猜你喜欢
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多