Переопределение стиля окна WPF в модуле Prism - PullRequest
1 голос
/ 27 сентября 2011

Я пишу модуль для приложения призмы, который мы не контролируем. Требуется, чтобы веб-браузер отображался в одном из регионов. К сожалению, каждое окно происходит от класса 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. Могу ли я вообще переопределить этот стиль? Или я пытаюсь сделать это неправильно?

1 Ответ

1 голос
/ 27 сентября 2011

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

Использование ResourceKey может помочь, в зависимости от вашей архитектуры.

...