2012-06-29 10 views
12

¿Puedo tener lo siguiente (ActualWidth dividido entre 2)?¿Se puede aplicar un operador matemático a la ruta de enlace?

<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}"> 

Parece que no funciona para mí.

Gracias.

+0

¿Qué estás tratando de hacer? Obtener 'Ancho' establecido a la mitad del valor de' SP1.ActualWidth'? Si es así, un 'Convertidor 'es probablemente lo que buscas. –

+0

No utilice 'ActualWidth' en los enlaces, ya que no es una propiedad de dependencia y no necesariamente hará lo que usted espera. Consulte las preguntas http://stackoverflow.com/questions/7403151 (WPF) y http://stackoverflow.com/questions/1602148 (Silverlight). –

+0

@PhilipKendall, sí, eso era lo que estaba tratando de hacer. Quiero que SP2 tenga la mitad del ancho de SP1 cada vez que se cambia el tamaño de la ventana. –

Respuesta

19

Puede usar un convertidor personalizado para realizar cálculos simples directamente en XAML.

echar un vistazo, por ejemplo, en esta aplicación: el uso

MathConverter

simple:

<RotateTransform Angle="{Binding Text, ElementName=Seconds, 
    Converter={ikriv:MathConverter}, ConverterParameter=x*6}" /> 

El enfoque clásico es el de crear una propiedad de sólo lectura calculada. Por lo tanto, en este caso simple puede agregar una segunda propiedad HalfWidth.

public double HalfWidth 
{ 
    get 
    { 
     return ActualWidth/2.0; 
    } 
} 

La mala noticia es que cuando ActualWidth se actualiza, el StackPanel en la vista con destino a HalfWidth no va a actualizar. Esto se debe a que la vista no sabe que HalfWidth ha cambiado.

Al generar un evento cambiado propiedad en HalfWidth en el conjunto de ActualWidth, la vista consultará HalfWidth y, por lo tanto, recuperará el valor correcto.

private double _actualWidth; 
public double ActualWidth 
{ 
    get 
    { 
     return _actualWidth; 
    } 
    set 
    { 
     if (_actualWidth != value) 
     { 
      _actualWidth = value; 
      OnPropertyChanged("ActualWidth"); 
      OnPropertyChanged("HalfWidth"); 
     } 
    } 
} 

La principal proplem acerca de este enfoque es que pronto se convertirá en una pesadilla cuando tenemos numerosas propiedades calculadas sin definidores.

Es por eso que (en un patrón MVVM) personalmente prefiero usar un convertidor personalizado.

+0

Gracias. ¿Cómo se decidiría si realizar todo este esfuerzo o simplemente tener una línea en el controlador de eventos SizeChanged de Windows en ¿código detrás? –

+0

@Old Geezer He actualizado mi respuesta –

2

No, solo puede usar propiedades (e índices en matrices/colecciones en algunos casos) en enlaces.

En su lugar, debe vincular a una propiedad de notificación que devuelve el valor previsto (por ejemplo, ActualWidth/2) o utilizar un convertidor que devuelve un valor con su cálculo aplicado.

Cuestiones relacionadas