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
Hi,
reicht es wenn Du die expliziten Styles nicht ein Control darunter definierst also im Panel was das Child vom Window ist?
Hallo mirus,
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Externe Ressourcen/ExterneRessourcenDateiTest.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Gruß,
MIchael
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
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.