Отключить наследование ресурсов wpf - PullRequest
0 голосов
/ 19 октября 2018

Из соображений производительности и изоляции у меня есть приложение, использующее межпроцессное взаимодействие и использующее методы System.AddIn.Pipeline.FrameworkElementAdapters.ContractToViewAdapter() и System.AddIn.Pipeline.FrameworkElementAdapters.ViewToContractAdapter() для передачи элементов управления GUI из процессов подключаемого модуля в хост-процесс.

Элементы управления графическим интерфейсом плагина - это, главным образом, предоставляемые Microsoft элементы управления с поддержкой интерфейса Microsoft Workflow Foundation.Многие из них имеют жестко запрограммированные цвета и кисти в своих определениях xaml, и их нелегко изменить.

Я поддерживаю два разных хост-приложения.Один из них имеет расширенную тематику через ResourceDictionary уровня приложения, а другой не выполняет никаких пользовательских тем.

В приложении без пользовательских тем элементы управления отображают таким образом Toolbox in unthemed host application

Но в приложении с настраиваемой тематикой это выглядит следующим образом Toolbox in themed host application

Он берет некоторые темы из основного приложения, но поскольку Microsoft жестко управляет-кодировать большую часть их цветов, они неполные и выглядят ужасно.

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

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
    xmlns:s="clr-namespace:System;assembly=mscorlib">

    <Color x:Key="aC03">#FF000000</Color>
    <Color x:Key="aC09">#FFFFFFFF</Color>
    <Color x:Key="aC10">#FF858C9D</Color>
    <Color x:Key="aC11">#FF000000</Color>
    <Color x:Key="aC13">#FF8C9097</Color>
    <Color x:Key="aC14">#FFFFFFFF</Color>
    <Color x:Key="aC15">#FF777D87</Color>
    <Color x:Key="aC16">#FF6E7582</Color>
    <Color x:Key="aC17">#FFE9ECEE</Color>
    <Color x:Key="aC20">#FF000000</Color>
    <Color x:Key="aC21">#FF000000</Color>

    <GradientStopCollection x:Key="aG01">
        <GradientStop Offset="0.00" Color="{StaticResource aC10}" />
        <GradientStop Offset="0.10" Color="{StaticResource aC13}" />
        <GradientStop Offset="0.49" Color="{StaticResource aC15}" />
        <GradientStop Offset="0.50" Color="{StaticResource aC16}" />
        <GradientStop Offset="1.00" Color="{StaticResource aC16}" />
    </GradientStopCollection>

    <SolidColorBrush x:Key="ControlTextBrush" PresentationOptions:Freeze="true" Color="{StaticResource aC03}" />
    <SolidColorBrush x:Key="ControlBrush" PresentationOptions:Freeze="true" Color="{StaticResource aC14}" />
    <SolidColorBrush x:Key="TextBox_Default_Layer1" PresentationOptions:Freeze="true" Color="{StaticResource aC14}" />
    <SolidColorBrush x:Key="TextBox_Default_Layer2" PresentationOptions:Freeze="true" Color="{StaticResource aC21}" />
    <SolidColorBrush x:Key="TextBox_Default_Layer3" PresentationOptions:Freeze="true" Color="{StaticResource aC11}" />
    <SolidColorBrush x:Key="ComboBox_Default_Layer2" PresentationOptions:Freeze="true" Color="{StaticResource aC20}" />
    <LinearGradientBrush x:Key="ComboBox_Default_Layer3" PresentationOptions:Freeze="true" GradientStops="{StaticResource aG01}" StartPoint="0,0" EndPoint="0,1" />
    <SolidColorBrush x:Key="ComboBox_Default_Text" PresentationOptions:Freeze="true" Color="{StaticResource aC03}" />
    <SolidColorBrush x:Key="WindowBrush" PresentationOptions:Freeze="true" Color="{StaticResource aC17}" />
    <SolidColorBrush x:Key="ContextMenu_Layer1" PresentationOptions:Freeze="true" Color="{StaticResource aC09}" />
</ResourceDictionary>

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

enter image description here

Таким образом, даже переопределение ресурсов кажется недостаточным.

Есть ли способ подавить / предотвратить / отключить наследование ресурсов или сделатьМне нужно переопределить каждый ресурс (цвет, кисть, стиль, шаблон и т. Д.), Который влияет на мои элементы управления?

Редактировать: Был запрошен код переопределения стиля.Я протестировал выполнение следующего для события Loaded и события Initialized (по отдельности, а не вместе), а также выполнение в потоке графического интерфейса против задачи.Вызов его в загруженном событии производит некоторые изменения, вызов его в инициализированном событии не

    var resources = new ResourceDictionary { Source = new Uri("pack://application:,,,/WorkflowRemoting;component/Host/ResourceOverride.xaml") };

    Action<DependencyObject, ResourceDictionary> 
        SetResources = null;
    SetResources = (element, dictionary) =>
    {
        DependencyObject[]
            children = null;
#if runInTask
        Dispatcher.Invoke(() =>
        {
#endif
            var nChildren = VisualTreeHelper.GetChildrenCount(element);
            children = Enumerable.Range(0, nChildren).Select(x => VisualTreeHelper.GetChild(element, x)).ToArray();
#if runInTask
        });
#endif
        foreach (var child in children)
        {
#if runInTask
            Dispatcher.Invoke(() =>
            {
#endif
                var fe = child as FrameworkElement;
                if (fe != null)

                    if (this.Resources == null)
                        fe.Resources = dictionary;
                    else
                        fe.Resources.MergedDictionaries.Add(dictionary);
#if runInTask
            });
#endif
            SetResources(child, dictionary);
        }
    };

#if runInTask
    Task.Run(() =>
    {
#endif
        SetResources(this, resources);
#if runInTask
    });
#endif

1 Ответ

0 голосов
/ 20 октября 2018

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

<Button Style="{x:Null}" Content="Press me"/>
...