C# WPF mit resource dictionaries

hemmoleg

Ensign
Registriert
Mai 2008
Beiträge
180
moin,

ich hab ein an sich schon "fertiges" programm. nun wollte ich das noch in anderen sprachen verfügbar machen. dabei is die effektivste methode ja wohl die mit den resource dictionaries.
bis jetz bin ich folgendermaßen vorgegangen:

zu erst das resource dictionary(ums einfacher zu machen hab ich das mal auf das nötigste reduziert)
Code:
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:system="clr-namespace:System;assembly=mscorlib">

    <system:String x:Key="labelTitleSettingWindow">Game options</system:String>

</ResourceDictionary>

das füge ich in der app.xaml hinzu:
Code:
<Application x:Class="ProjectArtist.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Localization\DictionaryEnglish.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

und genutzt wird es schließlich so:
Code:
<Label Content="{DynamicResource ResourceKey=labelTitleSettingWindow}" .../>

im designer funktioniert das auch soweit, nur wenn ich mein programm dann starte is das label einfach leer.
kann mir bitte jemand sagen wo mein fehler liegt?

wichtig ist das das dictionary anwendugsweit zur verfügung steht damit ich nicht für jedes fenster ein extra dictionary schreiben muss.
 
In deinem Beispiel sehe ich keinen Fehler.
Du kannst dir optional zwar etwas Tipparbeit sparen

Code:
<Label Content="{DynamicResource ResourceKey=labelTitleSettingWindow}" .../>

ist äquivalent zu

Code:
<Label Content="{DynamicResource labelTitleSettingWindow}" .../>

Dennoch, wo dein Problem liegen könnte.
Du verwendest wahrscheinlich überall DynamicResource. Gibst du den Key hier falsch an, wird deine Anwendung ganz normal kompilieren, da dynamische Resourcen zur Laufzeit bestimmt werden. Bsp:

Code:
<Label Content="{DynamicResource labelTitleSettingWNIDWO}" .../>

wird ohne Probleme starten. In der Anwendung selbst wirst du dann allerdings keinen Text für das Label sehen.

Anders verhalten sich hier statische Resourcen.

Code:
<Label Content="{StaticResource labelTitleSettingWNIDWO}" .../>

wird dir zur Compile-Zeit schon einen Fehler ausgeben.
Also, check mal deine Tippfehler :D
 
an tippfehlern liegts nich, denn dann würde sich das vs noch während ich programmiere beschweren das es den angegeben key nicht finden kann.

was ausserdem komisch ist, ist das wenn ich zur laufzeit im code auf das dictionary zugreife:
Code:
this.LabelTitleSettingWindow.Content = Application.Current.FindResource( "labelTitleSettingWindow" );
das label dann tatsächlich den richtigen text enthält.

ich hab halt irgendwie den verdacht das die resource dictionaries erst als letztes geladen werden, was aber eigentlich kein problem sein sollte da ich ja alles als dynamic resource deklariert habe.
 
hemmoleg schrieb:
an tippfehlern liegts nich, denn dann würde sich das vs noch während ich programmiere beschweren das es den angegeben key nicht finden kann.

Eben nicht. Dies gilt nur für StaticResources, aber nicht für DynamicResources.
Nichtsdestotrotz, hast du das Problem nur mit einem Label oder mit allen Strings aus dem Dictionary?
 
danke für dein tutorial. ich denke ich hab jetz auch meinen fehler gefunden. und zwar hängt der wohl damit zusammen wie ich überhaupt meine klassen und damit auch die fenster initialiesiere. ich hab das nämlich über die app.xaml.cs gemacht:
Code:
public partial class App : Application
    {
        static EventRouter eR = new EventRouter();
        UIManager uIM = new UIManager( eR );
        ...
    }

und in dem UIManager initialisiere ich auch gleich alle fenster und verstecke die erstmal bis sie eben gebraucht werden. naja und dort wird natürlich auch das SettingWindow (welches zu erst zu sehen ist) initialisiert und angezeigt (deswegen hatte keine StartUpUri festgelegt). am SettingWindow registriert sich der UIManager auch gleich als listener auf ein buttonClick event welches dafür sorgt das das spiel überhaupt erst los geht.

jedenfalls hab ich das SettingWindow nun als StartUpUri gesetzt. und dann funktioniert das auch mti den dictionary aber wie kann ich dann den UIManager noch als listener zum SettingWindow hinzufügen?
 
Zurück
Oben