Прозрачные границы WPF приводят к тому, что пользовательский интерфейс перестает перерисовываться

StackOverflow https://stackoverflow.com/questions/122857

Вопрос

В качестве продолжения мой предыдущий вопрос, мне интересно, как правильно использовать прозрачные окна.Если я настроил свое окно на использование прозрачности, пользовательский интерфейс иногда перестает отвечать на запросы.На самом деле происходит то, что пользовательский интерфейс просто не обновляется должным образом.Анимации не происходит, страницы не отображаются для навигации;однако, если вы наблюдаете, как отладчик нажимает на кнопки, ссылки и т. д.действительно работают.Сворачивание и восстановление окна снова «догоняет» пользовательский интерфейс, и пользователь может продолжать работу до тех пор, пока поведение не вернется.

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

Вот мое объявление окна для кода, который терпит неудачу.

<Window x:Class="MyProject.MainContainer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF APplication" Height="600" Width="800"    
    xmlns:egc="ControlLibrary" Background="{x:Null}"
    BorderThickness="0"
    AllowsTransparency="True"
    MinHeight="300" MinWidth="400" WindowStyle="None" >

И код, который не демонстрирует поведение

<Window x:Class="MyProject.MainContainer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF Application" Height="600" Width="800"    
    xmlns:egc="ControlLibrary" Background="{x:Null}"
    BorderThickness="0"
    AllowsTransparency="False"
    MinHeight="300" MinWidth="400" WindowStyle="None" >
Это было полезно?

Решение 2

Думаю, я наконец нашел обходной путь.Судя по всему, что я читал, эта проблема не должна возникать в XP SP3 и .NET 3.5 SP1, но это так.

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

Также следует отметить, что причина, по которой автор рекомендует этот метод, связана с проблемами производительности WPF и прозрачных окон.Хотя я считаю, что в .NET 3.5 SP1, возможно, это было лучше, но это было не так уж сложно реализовать и должно работать лучше.

Другие советы

Используете ли вы .NET 3.0 или .NET 3.5 в Windows XP SP2?Если это так, то это известная проблема с API прозрачных окон, которая была исправлена ​​в .NET 3.5 и SP3 для XP (и, я думаю, в SP1 для Vista).По сути, когда вы устанавливаете для параметра AllowsTransparency значение True, конвейер WPF должен выполнять рендеринг только в программном режиме.Это приведет к значительному снижению производительности большинства систем.

К сожалению, единственное, что вы можете сделать, чтобы это исправить, — это обновиться до .NET 3.0 SP1 (входит в .NET 3.5) и установить соответствующий пакет обновлений для Windows.Обратите внимание, что прозрачные окна по-прежнему работают медленнее, но не так плохо.Вы можете найти более подробное обсуждение здесь.

Я работаю на Windows XP Pro SP3 и использую .NET 3.5 SP1.Я также убедился, что проект ориентирован на версию 3.5 платформы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top