Недавно я столкнулся с похожей проблемой с черным окном в WPF в решении VB 2010 / .Net 4.0, где все остальные окна работали просто отлично. Виновным оказался способ, которым я включал видимость, используя следующие 3 команды ниже. Решение состояло в том, чтобы удалить все, кроме первой строки, со ссылкой на свойство Visibility (удаление только строки .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 в вызывающем окно, которое запускалось всякий раз, когда окно теряло фокус. Переключение его обратно с использованием свойства Visibility по-прежнему делает свое дело, не требуя каких-либо изменений этого оператора .Hide.
Надеюсь, это поможет любому, кто столкнется с этой раздражающей проблемой. Пока что большинство решений, которые я видел, разбросанных по Интернету, похоже, основаны на таких вещах, как темы Windows, видеокарты и другие внешние переменные, но мы, по-видимому, можем исправить хотя бы некоторые случаи этого права в нашем коде .Net. позади.