WPF 弹出窗口出现在其他桌面窗口上方,如何仅出现在 WPF 主窗口顶部?

问题描述 投票:0回答:3

我有一个带有网格的 WPF 主窗口,并且我添加了一个 WPF 弹出窗口,以在单击按钮时询问用户额外信息。但问题是,当其他桌面窗口移到弹出窗口上方时,弹出窗口会覆盖其他桌面窗口。如何解决此问题,以便弹出窗口仅位于 WPF 主窗口的最顶部,而不是其他桌面窗口。当设置为始终位于顶部时,弹出窗口的行为就像任务管理器!

如果您使用以下代码,您将看到弹出窗口保持在顶部。因此,将任何其他桌面窗口移到弹出窗口上,弹出窗口将覆盖其他桌面应用程序!请注意,我不想使用 StaysOpen="False"。

<Grid>
    <Popup Name="myPopup" Placement="Center" IsOpen="True">
        <StackPanel Background="Green" >
            <TextBox Width="200" Margin="0,0,10,0"/>
            <Button Name="closePopupBtn" Content="close" Width="100" />
        </StackPanel>
    </Popup>
</Grid>
wpf popup
3个回答
2
投票

您已在弹出窗口中设置了 Owner 属性。 在您的弹出窗口中,

this.owner = instanceOfParentWindow;

这也和你的问题类似。

弹出窗口始终位于顶部

他们在这里创建一个自定义弹出窗口 使用user32.dll


1
投票

我知道这是一个老问题,我通过搜索如何解决同样的问题找到了它。

最简单的方法,可行的方法是将 Popup 替换为 Tooltip 控件。 工具提示具有相同的基本功能,但它不像弹出窗口那样充当单独的层,因此工具提示不会出现在其他应用程序之上。

(Popup 不是 WPF 定义它们的控件,而是一个不打算按原样使用的组件)。


0
投票

我遇到了这个问题,但现在找到了解决方法。这可能并不适合所有人,具体取决于您如何控制弹出窗口的可见性,以及当应用程序窗口重新获得焦点时您期望发生的情况。

在我的用户界面中,我有一个弹出窗口,其可见性可通过单击按钮来切换。该按钮绑定到设置 bool VM 属性的 ICommand。这又绑定到弹出窗口的 IsOpen 属性:

<Popup x:Name="ElementPopup"
       IsOpen="{Binding ShowPopup, Mode=OneWay}" ...>

现在的问题是,用户单击按钮来显示弹出窗口,但在没有先隐藏弹出窗口的情况下离开我们的应用程序窗口,然后抱怨弹出窗口遮挡了新聚焦的窗口。我的解决方法是将以下触发器添加到按钮所在的数据模板中。当父窗口不再活动时,触发器将 Popup 的 IsOpen 设置为 false:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=IsActive}"
    Value="False">
    <Setter TargetName="ElementPopup"
        Property="IsOpen"
        Value="False" />
</DataTrigger>

当应用程序窗口失去焦点时,弹出窗口会隐藏,但有趣的是,当窗口再次变为活动状态时,它会再次变得可见(我猜 IsOpen 绑定会覆盖触发器设置的值)。后一种行为适合我们,因为我们希望用户使用按钮切换弹出窗口的可见性,但如果您希望弹出窗口保持隐藏,则此解决方案可能不合适。

© www.soinside.com 2019 - 2024. All rights reserved.