2012-06-29 18 views
12

Aşağıdakilere sahip olabilir miyim (ActualWidth 2'ye bölünmüştür)?Bir matematiksel operatör Ciltleme yoluna uygulanabilir mi?

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

Benim için çalışmıyor gibi görünüyor.

Teşekkürler.

+0

Ne yapmaya çalışıyorsunuz? "Genişlik", "SP1.ActualWidth" değerinin yarısına ayarlandı mı? Eğer öyleyse, 'Dönüştürücü' muhtemelen peşinde olduğunuzdur. –

+0

Bağımlılık özelliği olmadığından ve beklediğinizi yapmayacağınız için lütfen ActualWidth özelliğini bağlamalarda kullanmayın. Http://stackoverflow.com/questions/7403151 (WPF) ve http://stackoverflow.com/questions/1602148 (Silverlight) sorularına bakın. –

+0

@PhilipKendall, evet yapmaya çalıştığım şey buydu. Pencerenin her yeniden boyutlandırıldığında SP2'nin SP1'in yarısı kadar olmasını istiyorum. –

cevap

19

Doğrudan XAML'de basit hesaplamalar yapmak için özel bir dönüştürücü kullanabilirsiniz.

Bu uygulama, mesela, bir göz atın:

MathConverter

Basit kullanımı:

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

klasik yaklaşım salt okunur hesaplanan özellik yaratmaktır. Yani bu basit durumda HalfWidth ikinci bir özellik ekleyebilirsiniz.

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

kötü haber ActualWidth güncellendiğinde, HalfWidth bağlı görünümde StackPanel güncelleme olmayacak olmasıdır. Bunun nedeni, görünümün HalfWidth'un değiştiğini bilmemesidir.

ActualWidth ait setter HalfWidth bir özellik değiştirilen olayı yükselterek, görünümü HalfWidth sorgulamak ve dolayısıyla doğru değeri alacaktır.

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

bu yaklaşım hakkında ana proplem hiçbir belirleyiciler ile sayısız hesaplanan özelliklere sahip olduğunda yakında bir kabus haline gelecek olmasıdır. Bu nedenle (bir MVVM modelinde) kişisel bir dönüştürücü kullanmayı tercih ediyorum.

+0

olan iki sütun ızgarasının içine yerleştirin. Bu çabaların tümünden geçip geçmeyeceğine veya Windows'daki SizeChanged olay işleyicisine yalnızca bir satır eklemeye nasıl karar verirsiniz? kod arkasında? –

+0

@Old Geezer Cevabımı güncelledim –

2

Hayır, yalnızca (ve bazı durumlarda dizinleri/dizinleri dizinleri) bağlamalarda kullanabilirsiniz. Bunun yerine, hedeflenen değeri (örn. ActualWidth/2) döndüren bir bildirim özelliğine bağlamanız veya hesabınıza uygulanan bir değer döndüren bir dönüştürücü kullanmanız gerekir.

İlgili konular