如何禁用打开 WPF 弹出窗口

How to disable opening WPF popup

我有一个 Popup 和一个 ToggleButton。我设置了这样的绑定:

<ToggleButton x:Name="myToggle" Content="{Binding MyData.Title}" />
<Popup IsOpen="{Binding IsChecked, ElementName=myToggle}" >
   <TextBlock Text="{Binding MyData.Details}" />
</Popup>

如您所见,我将切换按钮的内容绑定到 MyData.Title,将弹出窗口的内容绑定到 MyData.Details

现在我有了条件MyData.ShowDetails。如果是 true 弹出窗口可以打开,如果是 false 则不应打开弹出窗口。

如何设置绑定以实现此目的?

我在 Popup 上测试了这些绑定,但没有一个有效:

Visibility="{Binding MyData.ShowDetails, Converter={StaticResource BooleanToVisibilityConverter}}"

IsEnable="{Binding MyData.ShowDetails}"

我在我的案例中找到了一个特殊的答案。我应该禁用 ToggleButton:

而不是禁用 Popup
<ToggleButton x:Name="myToggle" Content="{Binding MyData.Title}" 
              IsEnabled="{Binding MyData.ShowDetails}"/>
<Popup IsOpen="{Binding IsChecked, ElementName=myToggle}" >
   <TextBlock Text="{Binding MyData.Details}" />
</Popup>

效果完美!

注意:这不是 Popup 的一般答案。欢迎任何有答案的人。

您可以在 window.

中的所有内容之上放置一个面板(网格)

这需要设置背景,但如果您仍想看到 window 内容,可以设置低不透明度。

使其仅在显示弹出窗口时可见,否则折叠。

确保在显示时将焦点设置到弹出窗口。

.

谨记

弹出窗口是分开的 windows。

它们旨在短暂显示,如果长时间显示它们会有许多潜在的缺点。 EG 其他应用程序可以出现在它们下面并且它们不会随着它们的 "parent" window/control.

移动

您可能会发现模态 window 更简单,更适合您,具体取决于您的具体要求。

只需实例化一个 window 并使用

PopupWindow newWindow = new PopupWindow();
newWindow.ShowDialog();

其中 PopupWindow 只是任何旧的 window 样式,看起来像您想要的弹出窗口。

这将保证用户无法以某种方式与您应用中的任何其他 window 互动。

.

另一种可能性是在网格中显示您的 "popup" 内容,该网格显示在主 window.

中所有内容的顶部

这就是编辑数据的方式:

https://gallery.technet.microsoft.com/scriptcenter/WPF-Entity-Framework-MVVM-78cdc204

该方法的优点或缺点在于它在 window 中。 --- Brian Kress ---