2009-03-20 15 views
10

Ho un'applicazione XBAP con il seguente controllo utente:Come per andare a prendere stringa dalla risorsa da assegnare in sezione WPF risorsa in XAML

<UserControl x:Class="XXX.UsersGrid" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="Auto" Width="Auto"> 

     <UserControl.Resources> 
      <DataTemplate x:Key="UpArrowUsers"> 
       <DockPanel> 
        <TextBlock Text="xxUser" x:Name="upArrowUsersHeader" HorizontalAlignment="Center"></TextBlock> 
        <Path x:Name="arrow" StrokeThickness = "1" Fill= "gray" Data= "M 5,10 L 15,10 L 10,5 L 5,10"/> 
       </DockPanel> 
      </DataTemplate> 
    </UserControl> 
    ... 

Ora voglio andare a prendere la stringa "xxUser" da un file resx che è incorporato come risorsa nell'applicazione Come ottengo ciò?

risposta

3

Nessuna di queste risposte è vicina a ciò che si desidera. Comincerei leggendo su Localization in WPF. Scoprirai che se stai eseguendo la localizzazione con WPF, ti consigliamo x: Uid definito su ogni nodo della tua app.

http://msdn.microsoft.com/en-us/library/ms788718.aspx

+7

Sono contento che abbia aiutato il poster originale, ma in genere lo scopo del forum è aggiungere qualcosa ai documenti ufficiali. Solo i miei 2 centesimi. – greenoldman

0

Non so se questo può essere fatto direttamente in XAML ma se si scrive la propria classe di wrapper attorno a ResourceManager e si usa invece. Si noti che la classe eredita da TextBlock:

public class ResourceContentTextBlock : TextBlock 
{ 
    public string ResourceName 
    { 
     set 
     { 
      this.Text = Properties.Resources.ResourceManager.GetString(value); 
     } 
    } 
} 

È quindi possibile utilizzare ResourceContentTextBlock in XAML ovunque si sarebbe altrimenti utilizzare un TextBlock:

<Window x:Class="WpfApplication3.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:client="clr-namespace:WpfApplication3" 
    > 
     <client:ResourceContentTextBlock ResourceName="String1" /> 
</Window> 
+0

Sono confuso da questo. Cosa sta succedendo qui? Perché hai definito un setter, ma non getter? E i letterali "String1" in C# e XAML hanno qualche connessione? Si prega di precisare. –

+0

Hai ragione - Devo ammettere che questa è una risposta terribile con un paio di errori. Ho fatto qualche possibilità per correggerlo, ma è una soluzione ingombrante. L'idea è che la proprietà ResourceName sia impostata su "String1" in XAML. ResourceContentTextBlock utilizza questo valore per recuperare una stringa localizzata dalle risorse e aggiorna la proprietà Text della TextBox ereditata. Ecco perché non c'è bisogno di ottenere una proprietà. –

5

creare una classe statica che rende le risorse disponibili come proprietà:

public static class Resources 
{ 
    public string Resource 
    { 
     return Properties.Resources.ResourceManager.GetString("Resource"); 
    } 
} 

Poi si può vincolare il proprio TextBox a questo:

<TextBlock Text="{Binding Source={x:Static local:Resources}, Path=Resource}" x:Name="upArrowUsersHeader" HorizontalAlignment="Center" 
    xmlns:local="clr-namespace:MY_NAMESPACE;assembly=MY_ASSEMBLY"> 
42

sono stato in grado di farlo in un programma con:

<TextBlock VerticalAlignment="Center" Margin="3" 
      Text="{x:Static prop:Resources.OpenButton}" 
      Visibility="{Binding Source={x:Static prop:Settings.Default}, Path=ShowButtonText, Converter={StaticResource BoolToVis}}"></TextBlock> 

Ho anche dovuto includere il namespace .Properties nel mio XAML, in questo modo:

xmlns:prop="clr-namespace:MyProjectNamespace.Properties" 

Questo mi ha permesso non solo di utilizzare le risorse di stringa che avevo definito per il mio progetto per la globalizzazione, ma ero anche in grado di legare (in due modi) alle Impostazioni della mia applicazione. Questo mi permette di molto facilmente ricordare la posizione della finestra, le dimensioni, ecc. Come puoi vedere, usa Impostazioni. per impostazioni e risorse. per risorse.

Come ha detto Steven, penso che il modo "ufficiale" o il modo "migliore" sia quello di incollare x: Uid su tutto ciò che vuoi globalizzare, ma non l'ho fatto e ha funzionato senza problemi. Penso che la cosa x: Uid sia principalmente necessaria se si utilizzano strumenti automatici o si interrompe l'attività di traduzione come si farebbe in un grande progetto. Ho fatto tutte le mie cose manualmente in VS, quindi forse era ok.

Ben

+0

Grazie MOLTO per questa risposta utile e informativa. Mi ha aiutato molto - è stato l'ultimo pezzo mancante nel mio progetto :-) Ero solo confuso con Risorse - dovevano essere definiti tramite Proprietà del progetto, non da "Aggiungi -> Nuovo elemento -> Risorse", destra? – greenoldman

9

Due punti in più aggiuntivi che ho dimenticato di dire in precedenza in "Sono stato in grado di farlo ...":

  1. Non è necessario per avvolgere l'oggetto Properties.Resources nel tuo. Puoi accedervi direttamente, come ho fatto nel mio esempio sopra. Penso che avvolgere l'oggetto sia un modo per ottenere lo stesso risultato di cui discuto nel mio secondo punto.
  2. Per impostazione predefinita, i file di risorse sono creati con "ResXFileCodeGenerator". Questo li rende interni quando genera il file di codice, quindi xaml non può accedervi. È necessario modificare questo in "PublicResXFileCodeGenerator", che genera classi pubbliche.È possibile modificare questo facendo clic sul file di risorse in Solution Explorer e modificando la proprietà "Custom Tool".

(mi dispiace, non ho potuto modificare il mio post sopra perché ero un membro temporaneo in quel momento.)

+3

ad.2. Questa è un'omissione comune (sorpresa), VS consente di passare semplicemente a "pubblico" ("modificatore di accesso" nella barra degli strumenti). Non è necessario uno strumento di terze parti. – greenoldman

+0

Grazie per questo suggerimento, stavo cercando di capire perché le mie risorse erano tutte impostate su interne e non potevano essere utilizzate ... perché non è un campo a discesa in Visual Studio? : \ – John

4

Come Ben detto, e ho trovato an another tutorial. Il access modifier di Resources.resx deve essere modificato da Internal a Public. Ho fallito molte volte e dopo aver cambiato il access modifier in Public, funziona.

Problemi correlati