Есть ли способ исправить это мерцание аэрозоля и видимость границ клиента при использовании Window Chrome в WPF? - PullRequest
0 голосов
/ 01 мая 2020

Я использую функциональность WPF Window Chrome для настройки области Non-Client окна следующим образом:

<WindowChrome.WindowChrome>
    <WindowChrome GlassFrameThickness="0, 0, 0, 1" CornerRadius="0" CaptionHeight="29" UseAeroCaptionButtons="False" ResizeBorderThickness="5" NonClientFrameEdges="Bottom" />
</WindowChrome.WindowChrome>

Это дает мне пользовательское окно, которое очень близко к идеальному, как видно здесь: https://www.youtube.com/watch?v=f-HYxTCScnA

Объяснение видео

Сначала я запускаю приложение, показывая мерцание при запуске, на которое я ссылаюсь. Это короткое мерцание белого цвета, которое вы видите, когда происходит переход затухания.

Далее я показываю, что размер окна можно изменять без каких-либо мерцаний. Это очень трудно увидеть, но если вы посмотрите на нижнюю часть окна, вы увидите серую рамку размером 1 пиксель, которая соответствует фрагменту кода NonClientFrameEdges = "Bottom". Если у меня там нет этого кода, граница в 1 пиксель исчезнет, ​​но при изменении размера окно будет сильно мерцать.

Стоит также отметить, что граница гораздо заметнее, если GlassFrameThickness = "0, 0, 0, 1 "- это другое значение. Кажется, установка GlassFrameThickness на 1 на том же ребре, что и NonClientFrameEdge, делает NonClientFrame на этом ребре гораздо менее заметным, чем обычно.

Далее я показываю, что окно, когда оно развернуто, отлично работает с аэро просмотр миниатюр / просмотр. Однако, если вы посмотрите на предварительный просмотр миниатюр на панели задач, вы можете четко увидеть границу в 1 пиксель из NonClientFrameEdges = "Bottom".

Далее я покажу, что функция аэродинамического просмотра работает нормально, пока GlassFrameThickness не ноль.

Описание проблемы

На самом деле у меня 2 проблемы (обе проблемы можно увидеть на видео выше):

  1. При первой загрузке окна и при активации развернутого окна из свернутого состояния возникает эффект белого мерцания.
  2. Край рамки, не связанной с клиентом, в нижней части окна всегда слегка виден, включая предварительный просмотр.

Я предполагаю, что мерцание белого цвета вызвано загрузкой эффекта аэростекла перед загрузкой окна. Я знаю, что могу это исправить, установив GlassFrameThickness = "0" (который полностью удаляет рамку из аэростекла), но это вызывает две новые проблемы. Во-первых, на экране рабочего стола аэро не отображается контур окна, оно просто исчезает. Во-вторых, просмотр миниатюр в развернутом окне показывает смещение на 8 пикселей слева и сверху. Итак, я должен держать стеклянную раму, чтобы избежать этих проблем. Кроме того, установка толщины стеклянной рамы на ноль удаляет тень, что я не хочу делать.

Вот видео демонстрация проблем, которые возникают, если GlassFrameThickness установлен в 0: https://www.youtube.com/watch?v=nuVrna4DYYg

Проблема не-клиентского края кадра может быть решена установкой NonClientFrameEdges = "None", но этот параметр вызывает сильное мерцание при изменении размера окна. Если я установлю это на любой край, влево, вверх, вправо или вниз, изменение размера будет очень плавным и без мерцания. Установка GlassFrameThickness = "0, 0, 0, 1" и NonClientFrameEdges = "Bottom" помогает сделать его намного менее заметным, но его все равно можно увидеть, особенно в режиме предварительного просмотра миниатюр.

Я думал о попытке установить Window Chrome GlassFrameThickness к начальному значению 0 и, в событии Window_Loaded, установите его в 0, 0, 0, 1, чтобы избежать начального мигания при запуске программы, но это не решит проблему остальных время, например, при активации окна из развернутого состояния на панели задач.

Для видимого края, не являющегося клиентом, я подумал, может быть, есть какой-то способ сделать его прозрачным или изменить его цвет, возможно, с помощью рисовать над этим? Может быть, какой-то код взаимодействия? Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...