弹出窗口和 Window 的 AllowsTransparency

Popup and Window's AllowsTransparency

只要我在 Window 中将 AllowsTransparency 设置为 true 并关闭此 Window 前面的弹出窗口,Window 就不会重绘并且弹出窗口仍然显示在 Window.

之上

如果这个 Window 失去焦点或者如果我输入键盘的 "alt" 键,Window 会重新绘制并正确显示。

更清楚:

没有 AllowTransparency

显示的弹出窗口:

隐藏的弹出窗口:

使用 AllowTransparency

显示的弹出窗口:

隐藏的弹出窗口:

XAML:

<Window x:Class="Tests.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="1000"
        WindowStyle="None"
        AllowsTransparency="True">
    <Grid>
        <Rectangle Width="1000" Height="300" Fill="Red"></Rectangle>
        <CheckBox x:Name="PopupCheckBox">
            <TextBlock Text="Show popup"/>
        </CheckBox>
        <Popup IsOpen="{Binding ElementName=PopupCheckBox, Path=IsChecked}" Placement="Center">
            <Rectangle Width="500" Height="500" Fill="Green" />
        </Popup>
    </Grid>
</Window>

我想知道这种行为的原因是什么以及如何 fix/bypass 它。

谢谢。

编辑

我尝试在弹出窗口的 Closed 事件的处理程序中调用 InvalidateVisual,但它没有改变行为:

public MainWindow()
{
    InitializeComponent();
    PopupTest.Closed += PopupTest_Closed;
}

void PopupTest_Closed(object sender, EventArgs e)
{
    InvalidateVisual();
}

编辑 2

好的,显卡驱动程序似乎是导致此行为的原因。我将它更新到最新版本,虽然仍然显示工件,但它的行为有所不同(弹出窗口的显示区域小得多)。

关闭此线程。感谢大家。

我无法告诉您原因,但要解决此问题,请在关闭弹出窗口时在 window 上使用 InvalidateVisual 方法。

window.InvalidateVisual();

如问题的最新编辑所述,伪像是由过时的显卡驱动程序引起的。