2010-03-13 17 views
12

Soy nuevo en XAML, así que supongo que me falta algo simple. Quiero sustituir la parte de la ruta de la ruta de origen con el AC# constante para la gestión camino más fácil, por ejemplo, que tengo:En WPF XAML, ¿cómo puedo concatenar 2 constantes para que pueda usar rutas predefinidas?

<Image Source="/Images/Themes/Buttons/MyPicture.png" /> 

y en otra clase que he definido mi constante:

public static readonly string UriImagesButtons = "/Images/Big/PNG/"; 

I quieren tener algo en la línea de:

<Image Source="{static:UriImagesButtons + MyPicture.png}" /> 

Esto significa que puedo cambiar la ruta de acceso a nivel mundial a un derrame cerebral si surge la necesidad. ¿Cuál es la sintaxis para hacer esto?

Respuesta

2

Reemplazar la ruta significa que tiene que hacer un enlace de datos ... Entonces, ¿por qué no guarda en su clase C# la ruta de archivo completa y se une a ella?

+0

No quería ir por esa ruta ya que tengo numerosas imágenes y significaría que necesitaba una constante para cada una, lo que niega cualquier simplicidad de gestión. – Philip

2

Usted debe echar un vistazo a la discusión sobre este tema: string manipulation in xaml attribute

Básicamente, usted puede crear su propia extensión de marcado que tiene 2 parámetros y los concatena. Este ejemplo particular también se usa para vincular. Sospecho que le gustaría poder enlazar donde tiene definida la ruta de acceso raíz, o quizás algunos otros datos.

+0

Ok, tiene sentido. ¿Eso tendrá un rendimiento notorio si se usa ampliamente en una aplicación? – Philip

+0

Hmm, no sé. Supongo que depende de lo que es "extenso". –

17

La forma más sencilla de hacerlo es con un MultiBinding con un StringFormat:

<Path> 
    <Path.Source> 
     <MultiBinding StringFormat="{}{0}{1}"> 
      <Binding Mode="OneTime" Source="{x:Static lcl:ConstantOwner.UriImagesButtons}" /> 
      <Binding Mode="OneTime" Source="MyPicture.png" /> 
     </MultiBinding> 
    </Path.Source> 
</Path> 

En el parámetro StringFormat, usted tiene que escapar de la primera llave de cierre con un "{}" para que el analizador XAML doesn' Creo que es una extensión de marcado.

+0

Solución limpia. Sin embargo, lo que me sorprende de todos estos es que en el VB de la vieja escuela, simplemente definirías una constante, entonces el compilador la agregaría en tiempo de compilación cuando viera la concatenación de la cadena. Simple, la administración de código es buena y rápida de implementar. Estoy realmente sorprendido de que no parece haber una forma (simple) de hacer esto en XAML? ¿Todos codifican todas sus rutas en XAML o utilizan uno de los otros métodos en las (excelentes) respuestas hasta el momento? Parece un gran salto hacia atrás en la capacidad de gestión para mí ...? – Philip

+0

+1. Bonito. Me gustan las soluciones que usan cosas existentes, en lugar de requerir que se escriban nuevas. –

+0

@Philip, en su código detrás (podría ser C# de VB), define la cadena constante en mi solución. El MultiBinding es simplemente la forma integrada más fácil de concatenar cadenas. –

Cuestiones relacionadas