У меня есть приложение WPF (.NET Framework 4) с пользовательской границей окна. Я отключил стеклянную границу, используя WPF Shell Integration Library, и нарисую собственную границу. Однако я хочу добавить DropShadow вокруг границы окна, когда он не максимизирован. Я добавил тень, как это:Удалить DropShadow для максимального пользовательского окна WPF
private static bool DropShadow(Window window)
{
try
{
WindowInteropHelper helper = new WindowInteropHelper(window);
int val = 2;
int ret1 = DwmSetWindowAttribute(helper.Handle, 2, ref val, 4);
if (ret1 == 0)
{
Margins m = new Margins { Bottom = 0, Left = 0, Right = 0, Top = 0 };
int ret2 = DwmExtendFrameIntoClientArea(helper.Handle, ref m);
return ret2 == 0;
}
else
{
return false;
}
}
catch (Exception ex)
{
// Probably dwmapi.dll not found (incompatible OS)
return false;
}
}
Для получения более подробной информации см: DropShadow for WPF Borderless Window
Это решение отлично работает при работе с WindowState.Normal
! Однако, когда я максимизирую приложение и отключая DWMWA_NCRENDERING_POLICY
, фон окна становится слегка прозрачным, и большинство моих элементов управления отображаются совершенно иначе, чем я привык.
На следующем изображении вы видите максимизированное состояние, как было первоначально, и с теневым кодом. Как вы можете видеть, он полностью меняет прозрачность окна с теневым кодом: o
Есть что-то, что мне не хватает? Я читал через DWM Function library, но не могу найти ответ ...
Это может принести пользу вам для использования [Snoop] (http://snoopwpf.codeplex.com/) здесь - это действительно хороший инструмент для шпиона WPF, который позволяет вам видеть все различные отображаемые слои вашего приложения WPF, а также текущие значения свойств. –
Ничего не пришло, когда Snooping мое приложение, оба экземпляра точно такие же! Это где-то в winapi, что все пошло не так, я просто не знаю, почему ... поскольку я отключу политику рендеринга красиво, когда приложение максимизируется! – Kolky