Из соображений производительности и изоляции у меня есть приложение, использующее межпроцессное взаимодействие и использующее методы System.AddIn.Pipeline.FrameworkElementAdapters.ContractToViewAdapter()
и System.AddIn.Pipeline.FrameworkElementAdapters.ViewToContractAdapter()
для передачи элементов управления GUI из процессов подключаемого модуля в хост-процесс.
Элементы управления графическим интерфейсом плагина - это, главным образом, предоставляемые Microsoft элементы управления с поддержкой интерфейса Microsoft Workflow Foundation.Многие из них имеют жестко запрограммированные цвета и кисти в своих определениях xaml, и их нелегко изменить.
Я поддерживаю два разных хост-приложения.Один из них имеет расширенную тематику через ResourceDictionary уровня приложения, а другой не выполняет никаких пользовательских тем.
В приложении без пользовательских тем элементы управления отображают таким образом 
Но в приложении с настраиваемой тематикой это выглядит следующим образом 
Он берет некоторые темы из основного приложения, но поскольку 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>
Если я применю этот словарь ресурсов либо к корневому элементу управления, либо к тому и ко всем его дочерним элементам, он будет выглядеть следующим образом

Таким образом, даже переопределение ресурсов кажется недостаточным.
Есть ли способ подавить / предотвратить / отключить наследование ресурсов или сделатьМне нужно переопределить каждый ресурс (цвет, кисть, стиль, шаблон и т. Д.), Который влияет на мои элементы управления?
Редактировать: Был запрошен код переопределения стиля.Я протестировал выполнение следующего для события 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