Исправить отображение мусора, оставленное диалоговым окном WPF? - PullRequest
2 голосов
/ 18 января 2011

В моем приложении WPF у меня есть окна WPF, которые могут открывать другие диалоговые окна WPF, что я делаю следующим образом:

PickForEveryone PickForEveryoneWindow = new PickForEveryone(sSelRecipe, selMRM.sDay, selMRM.MealTypeID);
PickForEveryoneWindow.Owner = this;
PickForEveryoneWindow.ShowDialog();

Где PickForEveryone определяется как:

public partial class PickForEveryone : Window

и

<Window x:Class="PFWb0.PickForEveryone"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
 ShowInTaskbar="False"
 Title="Pick Recipe For All" Height="536" Width="441" 
 WindowStartupLocation="CenterOwner">

И содержит сетку с сеткой данных и несколько кнопок и флажков.

, которая отлично работает на моих компьютерах для разработки.Однако мой клиент продолжает видеть, как диалоговые окна оставляют часть своего отображения в виде визуального мусора поверх родительского окна, когда диалоговое окно закрывается.То есть, только часть окна не разворачивается, когда ShowDialog () возвращает.

Я попытался добавить this.InvalidateVisual ();ниже приведенного выше кода, но это не решило проблему.

Я также видел здесь предложение (для другого вида проблемы отображения WPF) вызвать OnRender () для принудительной перерисовки, но OnRender требует параметртипа DrawingContext, который я не знаю, как получить.

Итак, я спрашиваю, знает ли кто-нибудь, как решить проблему с дисплеем в первую очередь или как исправить ее, получив WPF дляперерисовать окно.

Обновление: как видно из комментариев к предлагаемым ответам ниже, у меня все еще нет решения, которое работает на компьютерах моего клиента, и моего обходного пути (наличия окон, уклоняющихся друг от друга) больше не достаточно.Единственное, что работает, - это минимизировать и максимизировать загрязненное основное окно.

Ответы [ 5 ]

5 голосов
/ 05 октября 2012

У меня была похожая проблема на конкретном компьютере с процессором ATOM N270. Проблема, похоже, связана с аппаратным ускорением графики.

Чтобы отключить ускорение, просто добавьте это в реестр (это отключит аппаратное ускорение для всех приложений WPF):

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration

Мне пришлось создать папку Avalon.Graphics.

DisableHWAcceleration - это DWORD, который должен быть установлен на 1.

Это решило мою проблему, если я снова активирую ускорение, проблема вернется.

Надеюсь, это поможет.

Ссылки:

1 голос
/ 29 июля 2011

Этот уродливый код работает для меня:

        void RefreshWindow()
    {
        switch (WindowState)
        {
            case WindowState.Maximized:
                {
                    double oldWidth = Width;
                    Width = System.Windows.SystemParameters.PrimaryScreenWidth - 1;
                    WindowState = System.Windows.WindowState.Normal;
                    WindowState = System.Windows.WindowState.Maximized;
                    Width = oldWidth;
                }
                break;
            case WindowState.Normal:
                if (Width > 1)
                {
                    Width -= 1;
                    Width += 1;
                }
                else
                {
                    Width += 1;
                    Width -= 1;
                }
                break;
            case WindowState.Minimized:
            default:
                // no action necessary
                break;
        }
    }
0 голосов
/ 09 февраля 2011

Это решение работает, но оно не очень красиво (легко увидеть, что диалоговое окно свернуто и затем установлено на нормальное)

this.WindowState = WindowState.Minimized;
this.WindowState = WindowState.Normal;
this.Topmost = true;
0 голосов
/ 10 февраля 2011

Пока что ничего из того, что я пробовал, на самом деле не работает на компьютере моего клиента.У меня есть новая попытка исправления (обходного решения) для тестирования клиента, которая включает в себя перемещение окна и попытка заставить его фактически вступить в силу, запустив пустое окно непосредственно перед тем, как я закрою диалоговое окно.Вздох ...

0 голосов
/ 19 января 2011

Итак, я искал ответ на этот вопрос на форумах MS, и, по-видимому, варианты этого вопроса просили уже несколько лет.

Иногда, говорят, проблема должнаделать с видео драйверами, но в моем случае мой клиент недавно обновил свои видео драйверы.

У меня сложилось впечатление, что Microsoft думала, что они разработали WPF, так что разработчик никогда не должен делать такие вещи.Как заставить перерисовать дисплей, так что они не делают этого намеренно.Конечно, когда что-то идет не так по какой-либо причине, это означает, что не существует прямого способа сделать это.И способы, которые кажутся такими, как они могут (например, InvalidateVisual ()), не надо.

Но я нашел один взлом, который работает.Ну, два.Уродливое - сказать окну свернуть и вернуться в нормальное состояние.Но это приводит к визуальной анимации этого, что не идеально.В моем случае это также заставляло это скрываться за другими открытыми окнами, требуя, чтобы я сделал это самым главным.Но это действительно решает проблему.

Код после ShowDialog:

    this.WindowState = WindowState.Minimized;
    this.WindowState = WindowState.Normal;
    this.Topmost = true;

Лучший хак, выглядит примерно так:

Код снаружи:

public delegate void NoArgDelegate();

Код после ShowDialog:

    this.Dispatcher.Invoke(
    System.Windows.Threading.DispatcherPriority.Loaded,
        (NoArgDelegate)delegate {}
    );

Presto ala kazzam!

...