Я пишу модуль для приложения призмы, который мы не контролируем. Требуется, чтобы веб-браузер отображался в одном из регионов. К сожалению, каждое окно происходит от класса CustomWindow, который имеет AllowsTransparency=true
. Наличие AllowTransparency=true
предотвращает отображение элемента управления WebBrowser.
Я могу щелкнуть правой кнопкой мыши и навести курсор на элемент управления и узнать, что веб-страница загружена (Google), поэтому я почти уверен, что проблема, с которой я столкнулся, связана с элементами управления прозрачностью и win32 (из которых WebBrowser насколько мне известно, это завернутый элемент управления win32.
Итак, я решил, что мой единственный путь действий - попытаться переопределить стиль окна, чтобы отключить AllowTransparency.
Это оскорбительный стиль (использование Reflector для просмотра baml):
<Style x:Key="{x:Type local:CustomWindow}" TargetType="{x:Type local:CustomWindow}">
<Setter Property="AllowsTransparency" Value="true" />
...
</Style>
И вот как я пытаюсь удалить стиль:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Vendor.App.WPFCommon.Controls;assembly=Vendor.App.WPFCommon">
<Style TargetType="{x:Type Controls:CustomWindow}">
<Setter Property="AllowsTransparency" Value="false" />
</Style>
</ResourceDictionary>
private void LoadThemeOverrides()
{
var assemblyName = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().ManifestModule.Name);
var overrides = new Uri(string.Format("{0};component/themes/overrides.xaml", assemblyName), UriKind.Relative);
var themeManager = _container.Resolve<IThemeManager>();
foreach (var theme in themeManager.ThemeCollection)
theme.Sources.Add(overrides);
var rd = new ResourceDictionary {Source = overrides};
Application.Current.Resources.MergedDictionaries.Add(rd);
themeManager.ChangeTheme(themeManager.CurrentTheme);
}
ResourceDictionary загружается правильно, поэтому проблема не в URI. Я отладил rd
, и я вижу там свой стиль.
Приведенный выше фрагмент кода выполняется между окном входа в систему, проверяющим имя пользователя и пароль, и отображаемым основным окном приложения. Это два разных окна, однако оба они являются производными от CustomWindow.
Используя WPF Inspector, я вижу, что в CustomWindows по-прежнему установлено значение AllowTransparency, равное true. Могу ли я вообще переопределить этот стиль? Или я пытаюсь сделать это неправильно?