【发布时间】:2011-03-26 09:30:42
【问题描述】:
为什么我必须在 WPF 表单上将 WindowStyle 属性设置为 None 以获得透明度,但在 Winforms 中我可以在任何表单上执行此操作,并保留边框、标准按钮等?显然 API 支持这一点,所以我不清楚 WPF 有什么特别之处会导致这个问题。
我猜 WPF 正在跳过一些 DirectX 或 OpenGL 箍,而 Winforms 只是通过 API 设置窗口的 alpha,但我可能会偏离基础。
【问题讨论】:
为什么我必须在 WPF 表单上将 WindowStyle 属性设置为 None 以获得透明度,但在 Winforms 中我可以在任何表单上执行此操作,并保留边框、标准按钮等?显然 API 支持这一点,所以我不清楚 WPF 有什么特别之处会导致这个问题。
我猜 WPF 正在跳过一些 DirectX 或 OpenGL 箍,而 Winforms 只是通过 API 设置窗口的 alpha,但我可能会偏离基础。
【问题讨论】:
同意,这太重了:
private void VerifyConsistencyWithAllowsTransparency(WindowStyle style)
{
if (AllowsTransparency && style != WindowStyle.None)
{
throw new InvalidOperationException(SR.Get(SRID.MustUseWindowStyleNone));
}
}
WPF 使用与 Windows 窗体、分层窗口完全相同的机制来实现这一点。没有明显的原因它不会在 WPF 中以相同的方式工作。从 Window.cs 中提取的代码 sn-p 简单地将其排除在外。但是,UsesPerPixelOpacity 属性有一个提示:
当您启用每像素不透明度时,系统不再绘制非客户区。这是因为 UsesPerPixelOpacity 的预期目的是显示在互操作场景中工作的非矩形顶级 UI,而显示矩形非客户区违背了该目的。
“互操作场景”,我猜。
【讨论】: