2016-08-06 3 views
0

Я пытаюсь создать приложение WPF для плагинов, на которое можно ссылаться в других приложениях, и последнее может изменить стили первого.Стиль переопределения WPF в разных сборках

Мой пример основан на BusiusIndicator от Xceed. У меня есть стиль для BusyIndicator в моем приложении WPF плагина и хочу, чтобы стиль этого BusyIndicator был изменен на другие приложения.

Пример:

WPF Plugin Application: Давайте назовем это OverrideBusyIndicator. Решение выглядит как на картинке ниже, где MainWindow, содержащий BusyIndicator существует и стиль BusyIndicator в BusyContextResourceDictionary.xaml

enter image description here

Содержание 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> 

enter image description here

Я создал другое решение, которое будет ссылаться на мою сборку выше. Назовем это 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"/>** 

ответ

0

Было бы полезно увидеть стиль для элемента управления xceed: BusyIndicator. Возможно, вам понадобится определить default style key property для вашего контроля.

+0

Я обновил свой вопрос. Я также искал свойство свойства ключа по умолчанию, но, я думаю, это уже задано xceed, кто создал этот элемент управления, поэтому я могу применить стиль в OverrideBusyIndicator.sln (первое приложение выше). –

+0

У вас есть два стиля с одинаковым типом цели. Вам нужно указать ключ для одного из них и обратиться к этому ключу в свой XAML или использовать атрибут BasedOn. –

+0

Спасибо, что указали это. Я попробовал BasedOn, и я схожу с ума, потому что это еще не работает (см. Править). –

Смежные вопросы