Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用StaysOpen时,WPF弹出窗口将立即关闭_C#_Wpf_Xaml_Mvvm_Popup - Fatal编程技术网

C# 使用StaysOpen时,WPF弹出窗口将立即关闭

C# 使用StaysOpen时,WPF弹出窗口将立即关闭,c#,wpf,xaml,mvvm,popup,C#,Wpf,Xaml,Mvvm,Popup,我定义了一个弹出窗口: <Popup StaysOpen="False" IsOpen="{Binding IsOpen, Mode=TwoWay}" /> 命令只执行以下代码(在我的视图模型中): 现在奇怪的是: 打开弹出窗口后,IsOpenproperty setter上的断点立即被值false击中,导致弹出窗口立即关闭 如果我删除StaysOpen=“False”(然后默认为True),则不会发生这种情况 这就像弹出窗口正在显示,但它没有获得/失去焦点,它关闭了 但我不明白为

我定义了一个弹出窗口:

<Popup StaysOpen="False" IsOpen="{Binding IsOpen, Mode=TwoWay}" />
命令只执行以下代码(在我的视图模型中):

现在奇怪的是:

打开弹出窗口后,
IsOpen
property setter上的断点立即被值
false
击中,导致弹出窗口立即关闭

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

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


但我不明白为什么?

Popup.StaysOpen属性:

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

如果在IsOpen属性设置为false时弹出控件关闭,则为true; 如果在弹出控件外部发生鼠标或键盘事件时弹出控件关闭,则为false。默认值为true

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


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

让我确定我理解了:您将一个值设置为false,然后怀疑它是否设置为false并对设置为false的值作出反应?@Christopher不,我没有将其设置为
false
,这是“WPF系统”中的某个地方的要点它被设置为false,这是由于
StaysOpen=“false”
Right。。。没有想到其他很多事件只是在弹出窗口外剪辑。。。仔细阅读文档的教训:)@MichałTurczyn“体验太棒了。不幸的是,你只有在你需要它的时候才能得到它。”-我的一个老朋友。另一个,希望是快速的问题:我在弹出窗口上有一个按钮,我必须点击两次,才能真正触发它的命令。就像弹出窗口是焦点一样,首先我必须单击“取消焦点”弹出窗口,然后我可以单击我的按钮。@MichałTurczyn我知道一个复选框和一个数据网格也有类似的行为。IIRC DataGrid元素“吃掉”Click事件,只是将焦点放在复选框上。我记不起脑子里到底是怎么回事了。最好你问一个单独的问题,因为这涉及到我现在不知道的WPF细节。好吧,事实证明,删除处理焦点事件的事件处理程序解决了这个问题,但我很不确定。。。我用弹出窗口创建了一个新的项目,它按预期工作。很可能是昨天,我用大量的“测试代码”充实了我的主要项目,结果它开始表现得很奇怪。。。谢谢你的支持。
<Button Command="{Binding OpenPopupCommand}" />
IsOpen = true;