2017-06-01 1 views
0

Ich habe zwei benutzerdefinierte Steuerelemente erstellt, beide von System.Windows.Controls.Button geerbt. Einer heißt XLButton und der andere ist XLBox. Sie haben identische XAML styles/Vorlagen in zwei getrennten ResourceDictionary Objekten in zwei separaten XAML-Dateien und identische Code-Behind-Dateien, außer dass "XLButton" erscheinen in den XLButton Dateien, in denen "XLBox" erscheint in den XLBox Dateien und vice versa.Verschieben von zusammengeführten XAML-ResourceDictionaries zu Generic.xaml verursacht Fehler

Ich habe ein einfaches Testfenster mit einer zweireihigen Grid erstellt. Ich füge die ResourceDictionary Dateien in das Window.Resources dieses Testfensters ein und erstelle eine Instanz jedes benutzerdefinierten Steuerelements, eines in der oberen Reihe, eines im unteren Bereich. Das funktioniert gut. Hier ist die XAML des Testfensters:

<Window x:Class="ScratchPadWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:ExLuminaControls" 
     mc:Ignorable="d" 
     Title="ScratchPadWindow" Height="118" Width="145"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="/Styles/XLBox.xaml" /> 
       <ResourceDictionary Source="/Styles/XLButton.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <local:XLBox Content="Hi!"/> 
     <local:XLButton Grid.Row="1" Content="Yeah!"/> 
    </Grid> 
</Window> 

Das funktioniert gut. Aber, wenn ich den ResourceDictionary.MergedDictionaries Abschnitt Kommentar aus und kopieren Sie sie in ihrer ursprünglichen Form zu Themes\Generic.xaml, so sieht es wie folgt aus:

<ResourceDictionary 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:ExLuminaControls" 
     mc:Ignorable="d"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/Styles/XLButton.xaml" /> 
     <ResourceDictionary Source="/Styles/XLBox.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

Ich erhalte eine „orten kann nicht Ressource‚styles/xlbutton.xaml‘Fehler, verbunden mit diese Zeile:

<local:XLBox Content="Hi!"/> 

das ist nicht für mich Sinn macht, aber was mehr verwirrend ist, dass das Problem verschwindet, wenn ich im Designer „Disable Projektcode“ klicken

ich bin. Verwenden von Mischung 2 017 Gemeinschaft.

Kann mir jemand helfen, das zu verstehen?

Danke!

Antwort

0

es Pfad Problem, wenn in generic, verwenden Sie es wie diese

<ResourceDictionary Source="/AssemblyName;Component/Styles/XLButton.xaml" /> 

oder müssen gehen mit "../../"

  1. Themen und generischem Klein
  2. Montageinfo
  3. app.xaml wenn nichts funktioniert

    [Montage: Th emeInfo ( ResourceDictionaryLocation.None, // wo sich themenspezifische Ressourcenwörterbücher befinden) // (wird verwendet, wenn auf der Seite keine Ressource gefunden wird, // oder Anwendungsressourcenwörterbücher) ResourceDictionaryLocation.SourceAssembly // wo das generische Ressourcenverzeichnis wird // (verwendet, wenn eine Ressource nicht in der Seite gefunden wird, // App oder irgendwelche themenspezifischen Ressourcenworte) befindet )]

    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
    
         <ResourceDictionary Source="pack://application:,,,/Fluent;Component/Themes/Generic.xaml" /> 
         ... 
        </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
    

Definition und Stil

#region --------------------CONSTRUCTORS-------------------- 

    static WaitSpin() 
    { 
     FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(typeof(WaitSpin), 
      new FrameworkPropertyMetadata(typeof(WaitSpin))); 
    } 

    /// <summary> 
    /// LoadingAnimation constructor. 
    /// </summary> 
    public WaitSpin() 
    { 
     this.DefaultStyleKey = typeof(WaitSpin); 
    } 

    #endregion 


<Style x:Key="{x:Type local:WaitSpin}" TargetType="{x:Type local:WaitSpin}"> 
+0

Ich fürchte, das macht keinen Unterschied. Es funktioniert immer noch, wenn ich die "ResourceDictionary" -Referenz in die .xaml-Datei des 'Window' setze, aber nicht, wenn ich sie (entweder mit oder ohne den'/ExLuminaControls; Component'-Teil des Pfades) in 'generic 'lege. XAML-Datei. –

+0

Ok, 3 andere zu überprüfen, siehe oben – GCamel

+0

Danke. Dein Pfad hat den Verweis korrigiert, als ich von Blend zu VS wechselte. All diese anderen Dinge sehen gut aus. Das Problem ist anscheinend subtiler, als ich dachte. Der benutzerdefinierte Stil hat immer noch keinen Effekt, wenn er in generic.xaml definiert ist. Wenn ich die Style-Definition direkt in die generic.xaml-Datei verschiebe, hat sie immer noch keine Auswirkungen. Aber wenn ich ein zweites Projekt mache, das bis auf den Namen identisch mit dem ersten ist, kann das zweite Projekt das benutzerdefinierte Steuerelement aus dem ersten Projekt instanziieren, und der Stil in generic.xaml wird angewendet. Keine Ahnung, warum generic.xaml in einem eigenen Projekt nicht anwendbar ist. Markieren Sie Ihre Antwort richtig. –

Verwandte Themen