Laden...

ResourceDictionary in MainWindow.xaml verwenden

Erstellt von mirus vor 10 Jahren Letzter Beitrag vor 10 Jahren 5.880 Views
M
mirus Themenstarter:in
21 Beiträge seit 2011
vor 10 Jahren
ResourceDictionary in MainWindow.xaml verwenden

Hallo,

ich habe eine externe Ressourcen Datei erstellt:
ExterneRessourcenDateiTest.xaml


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
    <Style x:Key="Style1" TargetType="{x:Type Button}">
        <Style.Setters>
            <Setter Property="Background" Value="Blue"></Setter>
        </Style.Setters>
    </Style>
    
</ResourceDictionary>

Diese möchte ich nun in der XAML-datei "MainWindow.xaml" verwenden:


    <Window.Resources>

        <!-- Definition, wenn nur eine Ressourcendatei verwendet wird--> 
        <ResourceDictionary Source="Externe Ressourcen/ExterneRessourcenDateiTest.xaml" />
                
        <!--Explizit gesetzte Styles-->

        <!-- Style kann bei allen Controls genutzt werden -->
        <Style x:Key="commonStyleWithTargetType" TargetType="{x:Type Control}">
            <Style.Setters>
                <Setter Property="Background" Value="White" />
                <Setter Property="BorderBrush" Value="Black" />
                <Setter Property="BorderThickness" Value="0.5" />
            </Style.Setters>
        </Style>
     </Window.Resources>

Nach dem Compilieren erhalte ich leider folgenden Fehler: "Die Resources-Eigenschaft wurde bereits für "MainWindow" festgelegt.".

Wenn ich den Style: "<Style x:Key="commonStyleWithTargetType" TargetType="{x:Type Control}">" komplett auskommentiere wird kein Fehler mehr erzeugt. Ich kann also keine externe Ressourcen-Datei verwenden, wenn ich schon "interne" Window.Resources gesetzt habe? Ich kann mir nicht vorstellen, dass das nicht erlaubt ist. Könnte mich hier jemand aufklären, habe ich irgendetwas nict beachtet? 😃 Danke.

Gruß,
mirus

W
955 Beiträge seit 2010
vor 10 Jahren

Hi,

reicht es wenn Du die expliziten Styles nicht ein Control darunter definierst also im Panel was das Child vom Window ist?

1.552 Beiträge seit 2010
vor 10 Jahren

Hallo mirus,


<ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
              <ResourceDictionary Source="Externe Ressourcen/ExterneRessourcenDateiTest.xaml" />
   </ResourceDictionary.MergedDictionaries>
   </ResourceDictionary>

Gruß,
MIchael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

M
mirus Themenstarter:in
21 Beiträge seit 2011
vor 10 Jahren

Danke für eure Antworten.

Wenn ich folgendes Versuche, dann erhalte ich noch den gleichen Fehler wie vorher:


<ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
              <ResourceDictionary Source="Externe Ressourcen/ExterneRessourcenDateiTest.xaml" />
   </ResourceDictionary.MergedDictionaries>
   </ResourceDictionary>

Wenn ich die internen Styles in einem Grid als Ressource setze, so wie von witte gepostet, dann funktioniert es. Das <Grid> ist hierbei ein Unterelement vom <Window>:


   <Grid>
        <Grid.Resources>
            <Style x:Key="commonStyleWithTargetType" TargetType="{x:Type Control}">
                <Style.Setters>
                    <Setter Property="Background" Value="White" />
                    <Setter Property="BorderBrush" Value="Black" />
                    <Setter Property="BorderThickness" Value="0.5" />
                </Style.Setters>
            </Style>

        </Grid.Resources>
  </Grid>

Ich habe leider noch keine Erklärung dafür gefunden, warum ich bei <Window.Resources> nicht ein ResourceDictionary und interne Styles zusammen definieren kann.

Gruß,
mirus

5.299 Beiträge seit 2008
vor 10 Jahren

das sind automatische Konvertierungen vom Xaml.
Window.Resources ist vom Typ ResourceDictionary, also wäre korrekt immer:

   
  <Window.Resources>
    <ResourceDictionary>
      <Style x:Key="commonStyleWithTargetType" TargetType="{x:Type Control}">
        <Style.Setters>
          <Setter Property="Background" Value="White" />
          <Setter Property="BorderBrush" Value="Black" />
          <Setter Property="BorderThickness" Value="0.5" />
        </Style.Setters>
      </Style>
      <!--weitere Resourcen-->
    </ResourceDictionary>
  </Window.Resources>

Vereinfachend kann man die explizite Angabe, dasses sich um ein ResourceDictionary handelt, weglassen


  <Window.Resources>
    <Style x:Key="commonStyleWithTargetType" TargetType="{x:Type Control}">
      <Style.Setters>
        <Setter Property="Background" Value="White" />
        <Setter Property="BorderBrush" Value="Black" />
        <Setter Property="BorderThickness" Value="0.5" />
      </Style.Setters>
    </Style>
    <!--weitere Resourcen-->
  </Window.Resources>

hier erkennt der Xaml-Parser, dass die Resourcen in ein ResourceDictionary gepackt sind.

nur beides geht nicht


  <Window.Resources>
    <ResourceDictionary>
      <Style x:Key="commonStyleWithTargetType" TargetType="{x:Type Control}">
        <Style.Setters>
          <Setter Property="Background" Value="White" />
          <Setter Property="BorderBrush" Value="Black" />
          <Setter Property="BorderThickness" Value="0.5" />
        </Style.Setters>
      </Style>
      <!--weitere Resourcen-->
    </ResourceDictionary>
    <Style x:Key="nochnStyle" TargetType="{x:Type Control}"/>
  </Window.Resources>

weil das würde ja bedeuten, dass den Resources 2 ResourceDictionaries zugewiesen werden.

Glaubich wenigstens, dasses sowas ist, weil beim Style kannsteja auch direkt in die Setters reinpacken, ohne anzugeben, dasses die Setters sind, wo reingepackt wird.
Also ebensogut wie


      <Style x:Key="commonStyleWithTargetType" TargetType="{x:Type Control}">
        <Style.Setters>
          <Setter Property="Background" Value="White" />
          <Setter Property="BorderBrush" Value="Black" />
          <Setter Property="BorderThickness" Value="0.5" />
        </Style.Setters>
      </Style>

geht auch


    <Style x:Key="commonStyleWithTargetType" TargetType="{x:Type Control}">
      <Setter Property="Background" Value="White" />
      <Setter Property="BorderBrush" Value="Black" />
      <Setter Property="BorderThickness" Value="0.5" />
    </Style>

Der frühe Apfel fängt den Wurm.