Я пытаюсь создать приложение WPF для плагинов, на которое можно ссылаться в других приложениях, и последнее может изменить стили первого.Стиль переопределения WPF в разных сборках
Мой пример основан на BusiusIndicator от Xceed. У меня есть стиль для BusyIndicator в моем приложении WPF плагина и хочу, чтобы стиль этого BusyIndicator был изменен на другие приложения.
Пример:
WPF Plugin Application: Давайте назовем это OverrideBusyIndicator. Решение выглядит как на картинке ниже, где MainWindow, содержащий BusyIndicator существует и стиль BusyIndicator в BusyContextResourceDictionary.xaml
Содержание BusyContextResourceDictionary.xaml это:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:xceed="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type xceed:BusyIndicator}">
<Setter Property="BusyContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Margin="4">
<TextBlock Text="Downloading Email" FontWeight="Bold" HorizontalAlignment="Center"/>
<StackPanel Margin="4">
<TextBlock Text="Downloading message 4/10..."/>
<ProgressBar Value="40" Height="15"/>
</StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="Pause" HorizontalAlignment="Right" Margin="0 0 2 0"/>
<Button Grid.Column="1" Content="Cancel" HorizontalAlignment="Left" Margin="2 0 0 0"/>
</Grid>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
Я создал другое решение, которое будет ссылаться на мою сборку выше. Назовем это OverrideBusyIndicator2. У этого нет главного окна, и его App.xaml просто вызывает другой OverrideBusyIndicator.MainWindow. Затем я добавил BusyContextResourceDictionary2.xaml, что I EXPECT переопределить стиль BusyIndicator, но это не так. В любом случае я мог бы добиться такого поведения?
<Application x:Class="OverrideBusyIndicator2.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xceed="http://schemas.xceed.com/wpf/xaml/toolkit"
StartupUri="pack://application:,,,/OverrideBusyIndicator;component/MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="BusyContextResourceDictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Для целей выборки BusyContextResourceDictionary2.xaml будет просто изменить текст TextBlock с «Загрузка электронной почты» на «Не Загрузка электронной почты».
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:xceed="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/OverrideBusyIndicator;component/BusyContextResourceDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
<!--I am using BasedOn to override the BusyContextResourceDictionary.xaml-->
<Style TargetType="{x:Type xceed:BusyIndicator}" BasedOn="{StaticResource {x:Type xceed:BusyIndicator}}">
<Setter Property="BusyContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Margin="4">
<TextBlock Text="NOT Downloading Email" FontWeight="Bold" HorizontalAlignment="Center"/>**
Я обновил свой вопрос. Я также искал свойство свойства ключа по умолчанию, но, я думаю, это уже задано xceed, кто создал этот элемент управления, поэтому я могу применить стиль в OverrideBusyIndicator.sln (первое приложение выше). –
У вас есть два стиля с одинаковым типом цели. Вам нужно указать ключ для одного из них и обратиться к этому ключу в свой XAML или использовать атрибут BasedOn. –
Спасибо, что указали это. Я попробовал BasedOn, и я схожу с ума, потому что это еще не работает (см. Править). –