2012-02-29 16 views
14

Recientemente descubrí que WPF admite diferentes unidades de medida en XAML. Además de los DIP predeterminados, también hay soporte para píxeles, pulgadas y centímetros (hasta donde yo sé). Esto le permite al diseñador escribir XAML como este:Unidades WPF y código subyacente

<Canvas> 
    <Line X1="0cm" X2="3cm" Y1="1cm" Y2="3cm" Stroke="Black"/> 
</Canvas> 

Sin embargo, no puede vincular estos valores. Imagine que tenemos una propiedad ViewModel with Dimension que es una Cadena, por ejemplo "7cm". Lo siguiente no funcionará:

<Button Width="{Binding Dimension}">Test</Button> 

Se lanza FormatException. Del mismo modo, cuando se crea un FrameworkElement de código subyacente, como esto:

Canvas1.Children.Add(new Button() { Width = "3cm", Content = "Test"}); 

compilación falla debido a excepción en el constructor/dondequiera que intenta crear el control.

me pregunto:

  • ¿Es posible utilizar unidades naturales (en mi caso métrica - centímetros) en el código subyacente?
  • ¿Cómo?
  • ¿Existe una lista completa de unidades compatibles con WPF/XAML?

EDIT:

Aquí hay un enlace de comentarios a continuación, que resuelve esta pregunta:

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.width.aspx

Respuesta

13

Usted puede hacer esto en el código detrás de la misma mediante la aplicación de conversión utiliza el XAML-analizador, no es necesario volver a implementar esta lógica, si no le importa que pasa alrededor de cuerdas:

button.Width = (double)new LengthConverter().ConvertFrom("2cm"); 

el XAML-analizador utiliza TypeConverters para convertir cadenas a los valores necesarios, en el documentation page of the Width property se puede ver que tiene un TypeConverterAttribute especificando que un LengthConverter debe ser utilizado. Este atributo se puede utilizar para anular localmente cómo una propiedad debe ser manejada, pero también puede ser aplicado a nivel de clase, por lo que si una clase Employee tiene este atributo se especifique que la EmployeeConverter se debe utilizar dicho convertidor será el predeterminado para las propiedades de tipo Employee.

estoy un poco sorprendido de la unión no se aplica este convertidor de tipos, pero usarlo dentro de un IValueConverter sería bastante simple, de hecho, se podría crear una markup extension que construye un IValueConverter de un convertidor de tipos para que sea bien genérico.

+0

Esto es lo que estaba buscando, ¡gracias! –

+0

De nada, me alegro de ayudar :) –

2

Para 1) y 2) Debido a que los DIP son independientes del dispositivo, se puede calcule cualquier "unidad natural" hacia y desde sin problemas. La excepción son (antinaturales :) píxeles dependientes del dispositivo.

Crear un ValueConverter que convierte valores de cadena de dobles donde sus unidades deseadas pueden ser especificados en la cadena. Luego puede usar ValueConverter en su Enlace y calcular en su ViewModel en "unidades naturales".

Por 3) y la puesta en práctica: He buscado en Google de forma rápida y no encontró nada, pero tal vez a una búsqueda más profunda mostrar algo. De lo contrario, crear tu propio convertidor no debería ser muy difícil. Aquí algunas informaciones de conversión:

96DIP == 1inch == 2.54cm; 
1cm == 37.8DIP; 
1zoll == 1inch == 2.54cm; 
+0

I tought Converter podría ser un camino por recorrer. Pero antes de escribir la mía, ¿crees que hay una forma de determinar qué convertidor usa el analizador XAML? Creo que ya debe haber un convertidor incorporado en WPF, ya que XAML admite estas unidades. Así que preferiría usar el incorporado, simplemente no puedo encontrar una manera de determinar cuál es. ¿Alguna investigación de rastreo de pila probablemente? Realmente no sé, ninguna idea, por favor? :) –

+1

@ Aaron: También me gusta usar elementos existentes, sin embargo, para cada conversor que pregunté a google, he encontrado rápidamente el nombre de la clase. Pero en este caso específico, Google no tenía nada que contar. Para detectar el convertidor usado en wpf, no puedo ayudar. Nunca profundicé en la FCL. Quizás vale la pena una pregunta específica: ¿cómo rastrear qué ValueConverter usa WPF para una conversión específica? – HCL

+0

Gracias por su respuesta. Trataré de calcular un convertidor correcto por mi cuenta y posiblemente formule una nueva pregunta si fallo. ¡Gracias de nuevo! –

Cuestiones relacionadas