myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » Resource Dictionary: StaticResource im Setter eines Styles einsetzen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Resource Dictionary: StaticResource im Setter eines Styles einsetzen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Davaaron
myCSharp.de-Mitglied

Dabei seit: 15.04.2016
Beiträge: 80


Davaaron ist offline

Resource Dictionary: StaticResource im Setter eines Styles einsetzen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

ist es möglich, dass ich eine statische Resource, z.B. Color, als Wert für einen Setter innerhalb eines Styles verwende? Ich habe es bereits auf dem "herkömmlichen" Weg versucht, aber ohne Erfolg. Im Editor konnte ich das Ergebnis kurz sehen und es sah gut aus. Nach ein paar Sekunden bekomme ich eine Fehlermeldung, dass die statische Ressource eine Exception ausgelöst hat, weil sie nicht gefunden werden kann.
So verwende ich den Style quasi in der Resource Dictionary:

XML-Code:
<Color x:Key="TxtDarkColor">#BEBEBE</Color>


    <Style x:Key="Test" TargetType="Window">
        <Setter Property="Background" Value="{TxtDarkColor}"></Setter>
    </Style>

Und so binde ich sie dann ein:

XML-Code:
<Button Style={StaticResource Test}/>

Wie macht ihr so was?
Neuer Beitrag 16.01.2020 22:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.382
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

XML-Code:
<Setter Property="Background" Value="{StaticResource TxtDarkColor}"></Setter>

und

XML-Code:
<Button Style="{StaticResource Test}"/>

mit Anführungszeichen!

Und

XML-Code:
<Style x:Key="Test" TargetType="Button">

mit dem richtigen TargetType.
Neuer Beitrag 16.01.2020 22:39 Beiträge des Benutzers | zu Buddylist hinzufügen
Caveman Caveman ist männlich
myCSharp.de-Mitglied

avatar-3854.jpg


Dabei seit: 18.10.2009
Beiträge: 130
Entwicklungsumgebung: VS2017P; VS2019P


Caveman ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,
die BackgroundProperty muss vom Typ SolidColorBrush sein!
Außerdem stimmt an mehreren Stellen die Syntax nicht ganz.

XML-Code:
    <Color x:Key="TxtDarkColor">#ebebeb</Color>
    <SolidColorBrush x:Key="BackgroundBrush" Color="{StaticResource TxtDarkColor}" />

    <Style x:Key="Test" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="{StaticResource BackgroundBrush}"></Setter>
    </Style>

XML-Code:
        <Button Style="{StaticResource Test}"/>
Neuer Beitrag 16.01.2020 22:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Davaaron
myCSharp.de-Mitglied

Dabei seit: 15.04.2016
Beiträge: 80

Themenstarter Thema begonnen von Davaaron

Davaaron ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ups, die Anführungszeichen habe ich beim Abtippen vergessen. Und ich hatte das falsche Template gepostet..
Das mit dem SolidColorBrush war eine gute Idee, jetzt habe ich wieder IntelliSense wenn es um die StaticResource Auswahl geht.
Was allerdings noch nicht so recht funktioniert ist das Einbinden des Styles per x:Key.

So sieht der aktuelle Style des Buttons aus:

XML-Code:
<Style x:Key="CloseableBtn" TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="BorderThickness" Value="0"></Setter>
            <Setter Property="Background" Value="Transparent"></Setter>
            <Setter Property="BorderBrush" Value="Transparent"></Setter>
            <Setter Property="Padding" Value="0,0,3,0"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Selected}" Value="True">
                    <Setter Property="Background" Value="Transparent"></Setter>
                </DataTrigger>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Transparent"></Setter>
                    <Setter Property="Foreground" Value="LightGoldenrodYellow"></Setter>
                    <Setter Property="BorderThickness" Value="1"></Setter>
                </Trigger>
                <DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource AncestorType=TabItem}}" Value="True">
                    <Setter Property="Visibility" Value="Visible"></Setter>
                    <Setter Property="Foreground" Value="DarkOrange"></Setter>
                    <Setter Property="BorderBrush" Value="DarkOrange"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>

Das Resource-Dictionary lade ich per Code-Behind, da es mit XAML irgendwie nicht laden wollte..
Und so verwende ich dann den Key in meinem Template:

XML-Code:
  <DataTemplate DataType="{x:Type vms:TabItemViewModel}" >
            <Grid MinWidth="75">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock VerticalAlignment="Center" Text="{Binding Header}"/>
                <Button Style="{StaticResource CloseableBtn}" Content="X" Grid.Column="1" Focusable="False"
                        FontFamily="Courier" FontSize="9" FontWeight="Bold"  Margin="0,1,0,0" Padding="0"
                         Width="16" Height="16"
                            Command="{Binding CloseCmd}"
/>
            </Grid>
        </DataTemplate>

Die Fehlermeldung lautet:

Zitat:
Exception: Die Ressource mit dem Namen "CloseableBtn" kann nicht gefunden werden. Bei Ressourcennamen wird die Groß- und Kleinschreibung berücksichtigt.

Was mich ebenfalls etwas stört, ist, dass die Styles nicht mehr im Designer angwendet werden. Somit sehen alle Controls gleich aus.. wenn ich aber den Style auskommentiere, dann sind in der laufenden Anwendung die Styles angewandt worden. Entferne ich dann während der Laufzeit die Kommentare im .xaml, dann werden auch die Styles mit dem x:Key angezeigt. Beende ich die App und starte sie neu, bekomme ich oben genannte Fehlermeldung.

Zu beachten ist dabei auch, dass ich NET Core 3 verwende.. könnte sich wohl auch um einen Bug handeln, oder? Müsste ich mal mit dem Framework gegen testen, oder fällt euch dazu was ein?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Davaaron am 17.01.2020 00:09.

Neuer Beitrag 17.01.2020 00:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.382
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Davaaron:
da es mit XAML irgendwie nicht laden wollte..

Zitat von Davaaron:
könnte sich wohl auch um einen Bug handeln, oder?

Angesichts deines bisher geposteten Codes würde ich erstmal nicht von einem Fehler bei Microsoft ausgehen. Aber mit "wollte irgendwie nicht" können wir halt auch nicht viel anfangen, um dir weiterzuhelfen.

Siehe auch  [Hinweis] Wie poste ich richtig?, Punkt 5
Neuer Beitrag 17.01.2020 09:49 Beiträge des Benutzers | zu Buddylist hinzufügen
Davaaron
myCSharp.de-Mitglied

Dabei seit: 15.04.2016
Beiträge: 80

Themenstarter Thema begonnen von Davaaron

Davaaron ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Aktuell lade ich das Resource Dictionary so rein (Code-Behind in MainWindow, nach InitalizeComponent):

C#-Code:
var s= new Uri("pack://application:,,,/Styles/ButtonStyle.xaml", UriKind.RelativeOrAbsolute);
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = s});

Weil folgende Lösungen nicht funktioniert haben (innerhalb App.xaml):

XML-Code:
<ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles/ButtonStyle.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

oder aber auch auch

XML-Code:
<ResourceDictionary x:Key="T" Source="Styles/ButtonStyle.xaml">

Es gab dazu keine Fehlermeldung und nichts, aber die Styles wurden eben nicht geladen.

Mein Problem ist aber nun nicht, dass das Resource Dictionary nicht geladen wird. Das Problem ist eher, dass der Key (CloseableBtn) aus dem Resource Dictionary nicht gefunden wird. Und da müsste es doch eigentlich egal sein, ob ich das Resource Dictionary nun per XAML oder Code-behind lade, oder nicht?
Neuer Beitrag 17.01.2020 12:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.591
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hast du dich evtl. einfach nur verschrieben und meinst ClosableBtn?
Neuer Beitrag 17.01.2020 13:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Davaaron
myCSharp.de-Mitglied

Dabei seit: 15.04.2016
Beiträge: 80

Themenstarter Thema begonnen von Davaaron

Davaaron ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ne, das ist es leider auch nicht. Hab auch den Namen per C&P hinter "StaticResource" eingefügt. Hab aber aus "Closeable" mal "Closable" gemacht, der Genauigkeit wegen.



Aber ich hab es nun... in der App.xaml hatte ich all meine DataTemplates (die Styles in der ButtonStyle.xaml) und hatte das ResourceDictionary per Code aber erst im MainWindowViewModel geladen. Daher konnte das xaml tatsächlich nicht gefunden werden..
Da ich kein AppViewModel haben will, probierte ich nochmal die XAML-Variante aus und die Lösung ist denkbar einfach: Man kann kein ResourceDictionary laden und gleichzeitig noch DataTemplates innerhalb des Resources-Tag deklarieren. Also sind die DataTemplates jetzt ebenfalls in die XAML gewandert und zwar ganz nach unten, so dass nun auch die per Key definierten Styles zur Verfügung stehen. In der App.xaml lade ich die Styles dann so:

XML-Code:
<Application.Resources>
        <ResourceDictionary Source="pack://application:,,,/Styles/ButtonStyle.xaml"/>

    </Application.Resources>
Neuer Beitrag 17.01.2020 18:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
p!lle
myCSharp.de-Mitglied

avatar-3556.jpg


Dabei seit: 22.02.2007
Beiträge: 1.032
Entwicklungsumgebung: Visual Studio (Community) 2019


p!lle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Davaaron:
Man kann kein ResourceDictionary laden und gleichzeitig noch DataTemplates innerhalb des Resources-Tag deklarieren.

Doch, kann man.

XML-Code:
<xyz.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Styles/ButtonStyle.xaml"/>
        </ResourceDictionary.MergedDictionaries>

        <!-- weitere Styles, Brushes, DataTemplates etc. definieren -->
    </ResourceDictionary>
</xyz.Resources>

Kannst du mal bitte kurz erzählen, wo du die DataTemplates vorher definiert hast?

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von p!lle am 21.01.2020 15:18.

Neuer Beitrag 21.01.2020 15:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Davaaron
myCSharp.de-Mitglied

Dabei seit: 15.04.2016
Beiträge: 80

Themenstarter Thema begonnen von Davaaron

Davaaron ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Stimmt, so geht's. Hatte vorher kein MergedDictionaries benutzt sondern einfach ein ResourceDictionary und auf der gleichen Ebene die DataTemplates geladen. Da kam dann auch die Fehlermeldung "The property Resources can only be set once.".



Mein erster Versuch war dieser hier:

XML-Code:
<Application.Resources>
        <ResourceDictionary Source="pack://application:,,,/Styles/ButtonStyle.xaml"/>
        <DataTemplate DataType="{x:Type vms:MainWindowViewModel}"></DataTemplate>
        <!-- weitere DataTemplates -->
</Application.Resources>

Das meinte ich quasi mit

Zitat:
Man kann kein ResourceDictionary laden und gleichzeitig noch DataTemplates innerhalb des Resources-Tag deklarieren.

Mir war schlichtweg nicht klar und es hat etwas gedauert um zu begreifen, dass "Application.Resources" neben "ResourceDictionary" keine weiteren Subelemente haben darf, wenn man sich dazu entscheidet, eben ein ResourceDictionary zu verwenden. Man kann aber, wie du schon gezeigt hast, beides kombinieren, wenn man ein MergedDictionary verwendet.

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Davaaron am 21.01.2020 21:24.

Neuer Beitrag 21.01.2020 21:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Monate.
Der letzte Beitrag ist älter als 4 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 03.06.2020 16:26