2009-03-20 12 views
10

Tengo una aplicación XBAP con el siguiente control de usuario:¿Cómo ha podido recuperar la cadena a partir de recursos para asignar en la sección de recursos WPF en 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> 
    ... 

Ahora quiero ir a buscar la cadena "xxUser" de un resx cuales está incrustado como recurso en la aplicación ¿Cómo logro esto?

Respuesta

3

Ninguna de esas respuestas está cerca de lo que desea. Comenzaría leyendo sobre Localización en WPF. Descubrirá que si realiza la localización con WPF, querrá que x: Uid esté definido en cada nodo de su aplicación.

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

+7

Me alegro de que haya ayudado al cartel original, pero por lo general el propósito del foro es agregar algo a los documentos oficiales. Solo mis 2 centavos. – greenoldman

0

No sé si esto se puede hacer directamente en XAML, pero si escribe su propia clase contenedora alrededor de ResourceManager y la utiliza en su lugar. Observe que la clase hereda de TextBlock:

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

A continuación, puede utilizar ResourceContentTextBlock en su XAML en cualquier lugar que de lo contrario usar 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

Estoy confundido por esto. ¿Que está pasando aqui? ¿Por qué has definido un setter, pero no getter? ¿Y los literales "String1" en C# y XAML tienen alguna conexión? Por favor aclara –

+0

Tiene usted razón, debo admitir que esta es una respuesta terrible con un par de errores. Logré algunas oportunidades para corregirlo, pero es una solución engorrosa. La idea es que la propiedad ResourceName esté establecida en "String1" en XAML. ResourceContentTextBlock utiliza este valor para recuperar una cadena localizada de los recursos y actualiza la propiedad Text del TextBox heredado. Es por eso que no hay necesidad de obtener una propiedad. –

5

crear una clase estática que hace que los recursos disponibles como propiedades:

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

a continuación, puede vincular a su cuadro de texto a esto:

<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

tuve la oportunidad de hacerlo en un programa 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> 

También he tenido que incluir el espacio de nombres .Las propiedades reportadas en mi xaml, así:

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

Esto me permitió no solo utilizar los recursos de cadena que había definido para mi proyecto de globalización, sino que también pude vincular (bidireccional) a la Configuración de mi aplicación. Esto me permite muy fácilmente recordar la posición de la ventana, el tamaño, etc. Como puede ver, use la Configuración. para configuraciones y Recursos. para recursos.

Como mencionó Steven, creo que la manera "oficial" o la "mejor" manera es poner x: Uid en todo lo que quiera globalizar, pero no lo hice y funcionó sin problemas. Creo que la opción x: Uid es más necesaria si está utilizando herramientas automatizadas o está interrumpiendo la tarea de traducción como lo haría en un proyecto grande. Acabo de hacer todas mis cosas manualmente en VS, así que tal vez estaba bien.

Ben

+0

Muchas gracias por esta útil e informativa respuesta. Me ayudó mucho - fue la última pieza que faltaba en mi proyecto :-) Solo me confundieron con los recursos: debían definirse a través de las propiedades del proyecto, no por "Agregar -> Nuevo elemento -> Recursos", ¿derecho? – greenoldman

9

Dos puntos más adicionales que se me olvidó mencionar más arriba en "yo era capaz de hacerlo ...":

  1. Usted no tiene que envolver el objeto Properties.Resources en tu propio Puede acceder directamente, como lo he hecho en mi ejemplo anterior. Creo que envolver el objeto es una forma de obtener el mismo resultado que analizo en mi segundo punto.
  2. De forma predeterminada, los archivos de recursos se crean con "ResXFileCodeGenerator". Esto los hace internos cuando genera el archivo de código, por lo que xaml no puede acceder a él. Debe cambiar esto a "PublicResXFileCodeGenerator", que genera clases públicas.Puede cambiar esto haciendo clic en el archivo de recursos en el explorador de soluciones y editando la propiedad "Herramienta personalizada".

(lo siento, no pude editar mi post anterior porque yo era un miembro temporal en ese momento.)

+3

ad.2. Esta es una omisión común (sorpresa), VS le permite simplemente cambiar a "público" (combo de "modificador de acceso" en la barra de herramientas). No se necesita ninguna herramienta de terceros. – greenoldman

+0

Gracias por este consejo, estaba tratando de descubrir por qué mis recursos estaban todos configurados en internos y no se podían usar ... ¿por qué no se trata de un campo desplegable en Visual Studio? : \ – John

4

Como se ha dicho Ben, y me encontré an another tutorial. El access modifier de Resources.resx debe cambiarse de Internal a Public. Fallé muchas veces y después de cambiar el access modifier al Public, funciona.

Cuestiones relacionadas