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


2

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

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

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

<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" > 
1

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

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

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

  0

Согласно статье в блоге, с которой я связан, это может вызвать проблемы с Vista. Если вам не нужно его поддерживать, отлично. Если вы это сделаете, обязательно проверьте его на Vista, прежде чем зайти слишком далеко :) 24 сен. 082008-09-24 17:17:06


2

Вы используете .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. Обратите внимание, что прозрачные окна еще медленнее, но не так плохо. Вы можете найти более подробное обсуждение here.


0

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

  0

В этом сообщении в блоге было указано, что некоторые драйверы видеокарты сделали копию растрового изображения через системную память. Возможно, обновление вашего видео dr ivers помогут. 23 сен. 082008-09-23 19:21:48

  0

Я проверял дважды, видеодрайверы уже обновлены с последними. Я должен был упомянуть, что это происходит на каждой рабочей станции, на которой он был протестирован (около 10 из них). 23 сен. 082008-09-23 20:40:29