Прозрачные границы WPF приводят к тому, что пользовательский интерфейс перестает перерисовываться - PullRequest
2 голосов
/ 23 сентября 2008

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 23 сентября 2008

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

1 голос
/ 24 сентября 2008

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

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

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

0 голосов
/ 23 сентября 2008

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

...