是否可以在 HwndHost 中托管 WPF 页面?

Is it possible to Host a WPF Page in HwndHost?

首先,这可能感觉是一个愚蠢的问题(您可以直接在 WPF window 中加载 WPF 内容),但实际上阅读完整描述以了解我为什么需要这个.

我正在开发一个 C# WPF 应用程序来模拟 Windows 亚克力模糊效果。我正在使用此处的示例代码:Win32 Composition Samples.

使用此代码,我能够在 HwndHost 上或直接在 Window 上创建丙烯酸模糊。但这会导致 Windows 航空航天问题,这意味着我在 window 上绘制的所有控件都将出现在 AcrylicBlur(模糊)下。喜欢这个 :

Acrylic 内容与我的 WPF 按钮重叠

所以我决定创建一个具有亚克力效果的 window 并创建一个 HwndHost 作为 window 的子级,这样我就可以将 WPF 内容重叠在亚克力之上模糊以使 WPF 控件不会变得模糊。

可能有效的解决方案

还有一个我可以尝试的概念,就是创建两个 windows 一个用 Acrylic 和一个用 WPF 并在那里分享 WM_POSITIONCHANGED 两者的消息 window这会导致 windows 平均移动和调整大小。但这有几个问题。

找到一种托管 WPF 页面的方法,而不是使用 HwndHost,我使用 HwndSource。

HwndSourceParameters param = new HwndSourceParameters("Host");
param.PositionX = 10;
param.PositionY = 10;
param.Width = 500;
param.Height = 500;
param.ExtendedWindowStyle +=0x00200000;  //This style creates a transparent window
param.WindowStyle = 0x10000000;
    
HwndSource src = new HwndSource(param);
src.SizeToContent = SizeToContent.WidthAndHeight;
src.CompositionTarget.BackgroundColor = Colors.Transparent;
src.RootVisual = new Page1(); //Your Page Here