我有一个WPF窗口,可以在SourceInitialized
事件期间自动启用玻璃。这非常有效。我将使用最简单的示例(只有一个窗口对象)来演示问题所在。
public partial class MainWindow : Window
{
public bool lolz = false;
public MainWindow()
{
InitializeComponent();
this.SourceInitialized += (x, y) =>
{
AeroExtend(this);
};
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (!lolz)
{
MainWindow mw = new MainWindow();
mw.lolz = true;
mw.ShowDialog();
}
}
}
这会创建两个MainWindow
。当我在Visual Studio中调试它时,一切都按预期工作。
当我在没有调试的情况下运行时,没有那么多。
子窗口有一个奇怪的,错误应用的玻璃框架......但只有在没有Visual Studio调试的情况下直接运行它。相同的代码运行了两次但结果不同。当我创建第二个窗口时没关系,我将它绑定到具有相同输出的按钮单击。
有什么想法吗?
编辑:以下是我用于AeroExtend
[DllImport("dwmapi.dll")]
private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMargins);
[DllImport("dwmapi.dll", PreserveSig = false)]
private static extern bool DwmIsCompositionEnabled();
[StructLayout(LayoutKind.Sequential)]
private class MARGINS
{
public MARGINS(Thickness t)
{
cxLeftWidth = (int)t.Left;
cxRightWidth = (int)t.Right;
cyTopHeight = (int)t.Top;
cyBottomHeight = (int)t.Bottom;
}
public int cxLeftWidth, cxRightWidth,
cyTopHeight, cyBottomHeight;
}
...
static public bool AeroExtend(this Window window)
{
if (Environment.OSVersion.Version.Major >= 6 && DwmIsCompositionEnabled())
{
IntPtr mainWindowPtr = new WindowInteropHelper(window).Handle;
HwndSource mainWindowSrc = HwndSource.FromHwnd(mainWindowPtr);
mainWindowSrc.CompositionTarget.BackgroundColor = Colors.Transparent;
window.Background = System.Windows.Media.Brushes.Transparent;
MARGINS margins = new MARGINS(new Thickness(-1));
int result = DwmExtendFrameIntoClientArea(mainWindowSrc.Handle, ref margins);
if (result < 0)
{
return false;
}
return true;
}
return false;
}
答案 0 :(得分:3)
问题在于您将MARGINS定义为类。您会注意到,如果您尝试为边距使用不同的值集(例如,每条边上10个像素),它仍会尝试填充整个区域。另外,正如我前几天在评论中提到的那样,你会注意到即使在未以模态显示的原始窗口中,你的右下角也有一个神器。如果只是将MARGINS从类更改为结构,则不会发生问题。 e.g。
[StructLayout(LayoutKind.Sequential)]
private struct MARGINS
或者你可以让MARGINS成为一个类,但是你应该改变定义DwmExtendFrameIntoClientArea的方式。 e.g。
[DllImport("dwmapi.dll")]
private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, [MarshalAs(UnmanagedType.LPStruct)] MARGINS pMargins);