Задать вопрос
@vitasoff
Software engineer

WPF Как избавиться от мерцания окна?

Привет, помогите пожалуйста разобраться :)

Сделал: поменял стиль окна.
Получил: при изменении размера окно начинает мерцать. Мерцает на Win 7. В Win 10 такого не заметил.

Если установить свойство AllowsTransparency="True" мерцание исчезает, но это свойство не устраивает (значительно увеличивается потребление CPU), оно обязательно должно быть FALSE.

Вижу два варианта
  1. Разобраться почему при AllowsTransparency="True" анимация сильно теряет FPS, видны рывки, и без анимации значительно увеличивается потребление CPU
  2. Убрать мерцание при AllowsTransparency="False"


Пример мерцающего окна на гитхабе: https://github.com/KovtunV/WindowFlickers
  • Вопрос задан
  • 549 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
cyber_roach
@cyber_roach
UX дизайнер INEDIapps
Есть несколько ошибок в коде стиля

1) не используйте лишние бордеры создавая ненужные ветви дерева
<!--Back border-->
                            <Border x:Name="BackBorder"
                                    Background="LightGray">
                            </Border>

у вас выше уже был бордер чтобы сделать и рамку и фон, зачем лишние?

2) Вы забыли самый важный элемент стиля окна - AdornerDecorator.
Кажется что он ни на что не влияет, но на самом деле именно из-за него и происходят все глюки в него нужно обернуть ContentPresenter (а точнее весь пользовательский контент)
Скорее всего мерцания именно из-за этого
Вообще, если с контролом непонятные визуальные глюки, всегда советую обращаться к документации по стандартным стилям, скорее всего вы забыли какую-то важную часть кода (чаще всего какой-нибудь "PART_")
https://docs.microsoft.com/ru-ru/dotnet/framework/...

3) используйте привязки к свойствам окна (беграунд, бордер, толщина бордера) внутри темплейта

4) ну и у вас как-то странно стиль применен x:Type local:MainWindow, вместо x:Type Window

Вот пример темплейта стиля:
<Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Border x:Name="RootContainer" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                        <AdornerDecorator>
                            <DockPanel>
                                <Border DockPanel.Dock="Top" Background="{StaticResource WindowHeaderBackgroundBrush}">
                                      <!--тут ваши стили заголовка и его элементов-->
                                </Border>
                                <ContentPresenter/>
                            </DockPanel>
                        </AdornerDecorator>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="WindowState" Value="Maximized">
                            <Setter TargetName="RootContainer" Property="Padding" Value="7"/>
                        </Trigger>
                        <Trigger Property="IsActive" Value="False">
                            <Setter TargetName="RootContainer" Property="BorderBrush" Value="#FF333333"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>


Если мерцания после правок не пропадут на 7ке, значит необходимо таки добавить рамку WindowChrome (стандартная тень от окна и базовый бордер) для этой ОС,
хотя бы вот так GlassFrameThickness="0,1,0,0"
Либо отказаться от WindowChrome полностью (но тогда нужен какой-то кастомный контрол окна, поддерживающий все фишки Aero (например drag за заголовок и стук о край экрана), у меня раньше такой использовался, но с приходом WindowChrome свойств он стал не нужен.
Вообще отказываться от WindowChrome тени окна я бы не рекомендовал, уж слишком лучше выглядят с ней окошки, а любое кастомное решение будет проигрывать стандартной Aero тени в производительности и неглючности.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы