Подтвердить что ты не робот

Окно wpf полностью черное

Я продаю приложение WPF, на одной машине клиента (из нескольких сотен) все окно приложения черное, кто-нибудь знает, что происходит?

Аппарат работает под управлением Windows XP с .net 3.5SP1, графическим адаптером является GeForce 6200 с двумя мониторами (отключение одного монитора не решает проблему).

Настройка "Параметры совместимости" на "256 цветов" решает проблему (но это не жизнеспособное решение, мне нужно больше цветов, чтобы приложение выглядело хорошо).

Приложение yaTimer (http://www.nbdtech.com/yaTimer/), у него есть пользовательский оконный хром на основе методов, описанных в этом сообщении http://blogs.msdn.com/wpfsdk/archive/2008/09/08/custom-window-chrome-in-wpf.aspx в разделе "Office 2007 без Aero".

Если кто-нибудь может дать мне понять, что происходит, я буду очень благодарен.

Спасибо.

4b9b3361

Ответ 1

Мы (www.novamind.com) имели несколько клиентов в прошлом, имеющих похожие проблемы, когда приложение не рисовало правильно или вообще не рисовало. Причины:

  • графический драйвер не обновлен.
  • Тема Windows повреждена. Изменение темы Windows на что-то другое и обратно, решила проблему.
  • Windows работает на виртуальной машине. У большинства виртуальных машин есть экспериментальная функция аппаратного ускорения, которая часто не поддерживает приложения WPF. - Отключение аппаратного ускорения решает проблему.

Это также может помочь:

  • Переустановите платформу .NET - иногда установка повреждена.
  • Убедитесь, что установлены все последние обновления Windows.

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

Ответ 2

У меня есть эта проблема только при включенном GlassFrame в окне chome.

Попробуйте установить GlassFraneThickness на 0, и ваше окно снова отобразится. Однако вы потеряете рамку из стекла, но лучше, чем черное приложение.

<shell:WindowChrome.WindowChrome>
    <shell:WindowChrome CaptionHeight="32" GlassFrameThickness="0" ResizeBorderThickness="5" CornerRadius="0" />
</shell:WindowChrome.WindowChrome>

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

В исходном коде Microsoft.Windows.Shell есть функция _FixupWindows7Issues() (в классе WindowChromeWorker), которая должна исправлять проблему в соответствии с этим комментарием, но, очевидно, не...

Ответ 3

У меня возникла проблема с переопределением шаблона окна. Я понял, что если вы, но наследуете стиль окна в Themes/Generic.xaml, он работает. Но в любом другом ресурсе вы получите черное окно. (VS 2008 - WPF 3.5)

Ответ 4

Возможным обходным путем является принудительное рендеринг программного режима:

http://msdn.microsoft.com/en-us/library/system.windows.interop.rendermode.aspx

В 3.5 это может быть задано для каждого окна http://msdn.microsoft.com/en-us/library/system.windows.interop.hwndtarget.rendermode%28VS.90%29.aspx, а в версии 4.0 также есть установка процесса: http://msdn.microsoft.com/en-us/library/system.windows.media.renderoptions.processrendermode.aspx

Ответ 6

Попробуйте установить последний пакет DirectX на клиентской машине.

Ответ 7

Недавно я столкнулся с аналогичной проблемой с черным окном в WPF в решении VB 2010/.NET 4.0, где все остальные окна работали отлично. Преступник оказался тем способом, которым я переключил видимость, используя следующие 3 команды ниже. Решение заключалось в том, чтобы удалить все, кроме первой строки, одну с ссылкой на свойство видимости (удаление только строки .Show приведет к тому, что она будет отображаться правильно в первый раз, но затем черная):

             Application.MisbehavingBlackWindow.Visibility = System.Windows.Visibility.Visible
             Application.MisbehavingBlackWindow.Show()
             Application.MisbehavingBlackWindow.Activate()

У меня никогда не было проблемы с этой серией команд, чтобы показать окно WPF, поэтому, я думаю, я попал в колею и никогда не потрудился проверить, был ли это оптимальный способ сделать это; по привычке, я просто вставил код по мере необходимости, чтобы вызвать окна. Он по-прежнему работает для каждого другого окна в любом другом решении, которое я когда-либо писал, но это заставило это конкретное окно черным. Сначала это происходило только периодически в одной конкретной рутине, а затем становилось постоянным по неизвестным причинам. Ни одна из следующих строк кода, с которыми я экспериментировал, не имела никакого значения:

            Application.MisbehavingBlackWindow.InvalidateVisual()
            Application.MisbehavingBlackWindow.InvalidateArrange()
            Application.MisbehavingBlackWindow.UpdateLayout()
            Application.MisbehavingBlackWindow.BringIntoView()
            Application.MisbehavingBlackWindow.WindowState = WindowState.Minimized
            Application.MisbehavingBlackWindow.WindowState = WindowState.Normal

Удаление всех элементов управления из окна не повлияло; он по-прежнему станет черным, если он будет заполнен только одним TextBlock. С другой стороны, шаблон появился после того, как я попытался выполнить его из других подпрограмм, особенно если вставил первый блок кода внутри одного, вызвавшего другое окно. Если я вставил его непосредственно перед блоком кода, подобным приведенному ниже, окно стало черным; если я вставил его после, это не так.

                Application.OtherWindow.Visibility = System.Windows.Visibility.Visible
                Application.OtherWindow.Show()
                Application.OtherWindow.Activate()

Решение работает (пока), даже если окно скрыто с помощью команды Window.Hide(). У меня уже был один включенный в событие Sub внутри оскорбительного окна, которое запускалось всякий раз, когда окно теряло фокус. Переключение его на использование свойства Видимость по-прежнему делает трюк, не требуя никаких изменений в этом утверждении. Скрыть.

Я надеюсь, что это поможет любому, кто сталкивается с этой раздражающей проблемой. До сих пор большинство решений, которые я видел, разбросанных по Интернету, похоже, основывались на таких вещах, как темы Windows, графические карты и другие внешние переменные, но мы, по-видимому, можем исправить хотя бы некоторые примеры этого права в нашем .Net-коде, позади.