2016-08-06 29 views
0

Ich versuche, eine WPF-Plugin-Anwendung, die auf andere Anwendungen verwiesen werden kann, und die letzteren können die Stile des ehemaligen ändern.WPF Override-Stil in verschiedenen Assembly

Mein Beispiel basiert auf Xceed's BusyIndicator. Ich habe einen Stil für den BusyIndicator in meiner Plugin-WPF-App und möchte, dass der Stil des BusyIndicators in anderen Anwendungen geändert wird.

Beispiel:

WPF Plugin Anwendung: Lassen Sie uns es nennen OverrideBusyIndicator. Die Lösung sieht aus wie das Bild unten, wo ein Hauptfenster die BusyIndicator enthält existiert und der BusyIndicator Stil ist in BusyContextResourceDictionary.xaml

enter image description here

Der Inhalt BusyContextResourceDictionary.xaml dies:

<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

Ich habe eine andere Lösung erstellt, die auf meine obige Baugruppe verweist. Nennen wir es OverrideBusyIndicator2. Dieser hat kein Hauptfenster und sein App.xaml ruft einfach den anderen OverrideBusyIndicator.MainWindow auf. Ich fügte dann eine BusyContextResourceDictionary2.xaml hinzu, die I EXPECT den Stil des BusyIndicator überschreiben, aber es nicht tut. Irgendwie könnte ich dieses Verhalten erreichen?

<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> 

Für die Beispielzwecke ändert BusyContextResourceDictionary2.xaml wird nur den Textblock Text von „Herunterladen von E-Mail“ auf „Nicht E-Mail-Download“.

<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"/>** 

Antwort

0

Es wäre hilfreich, den Stil für die Xceed zu sehen: BusyIndicator Kontrolle. Möglicherweise müssen Sie die default style key property für Ihre Steuerung definieren.

+0

Ich habe meine Frage aktualisiert. Ich habe auch über die Standard-Stil Schlüssel Eigenschaft gesucht, aber ich denke, das ist bereits von Xceed gesetzt, die dieses Steuerelement erstellt, weshalb ich den Stil in OverrideBusyIndicator.sln (erste App oben) anwenden kann. –

+0

Sie haben zwei Stile mit demselben Zieltyp. Sie müssen einen Schlüssel für einen von ihnen angeben und auf diesen Schlüssel in Ihrem XAML verweisen oder das Attribut BasedOn verwenden. –

+0

Danke für die Angabe. Ich habe versucht das BasedOn und ich bin verrückt, warum das noch nicht funktioniert (siehe Bearbeiten). –