2010-01-04 61 views
1

我想將數據綁定到一個矩形的RenderSize的TextBlock。這是代碼。爲什麼我的綁定不會在UIElement.RenderSize或UIElement.ActualWidth上更新?

<StackPanel x:Name="root"> 
     <Rectangle x:Name="rect" Fill="Green" RenderTransformOrigin="0.5,0.5" Height="100" Width="100" /> 

     <TextBlock Text="{Binding ElementName=rect, Path=Width}"></TextBlock> 
     <TextBlock Text="{Binding ElementName=rect, Path=ActualWidth}"></TextBlock> 
     <TextBlock Text="{Binding ElementName=rect, Path=RenderSize}"></TextBlock> 
     <Slider Value="{Binding ElementName=rect, Path=Width, Mode=TwoWay}" Maximum="200"></Slider> 
     <Button Content="Manually Get RenderSize" Click="Button_Click_1"></Button> 
     <TextBlock x:Name="info"></TextBlock> 
    </StackPanel> 

當我移動滑塊時,矩形會變大,並且正確更新第一個文本框。 但是,ActualWidth和RenderSize保持爲0,0,0。

當我點擊按鈕時,以編程方式獲取RenderSize,並在最後一個TextBlock中顯示它,它不同於0,0。

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    info.Text = rect.RenderSize.ToString(); 
} 

所以我在RenderSize上的綁定不能正確更新TextBox ......爲什麼? 感謝您的幫助,

回答

2

我寫的答案,類似的問題在這裏:

Binding to ActualWidth does not work

它應該是對你有用。

+0

在Silverlight中又一次黑客攻擊,它開始讓我發瘋...... – 2010-01-04 20:21:35

+0

如果您只處理元素上的SizeChanged事件並在事件處理程序中更新適當的值,它可能會更容易。如果您必須使用數據綁定,則僅在需要鏈接的帖子中介紹的解決方案纔是必需的。 – KeithMahoney 2010-01-04 20:47:49

2

RenderSize不依賴屬性,但它對應於依賴屬性(ActualWidth的,的ActualHeight)

所以綁定到RenderSize我們可以使用MultiBinding來(ActualWidth的,的ActualHeight)

<TextBlock> 
    <TextBlock.Text> 
    <MultiBinding Converter="{x:Static MyConv:SizePartsToSizeConverter.Instance}"> 
        <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/> 
        <Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/> 
    </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

public class SizePartsToSizeConverter:IMultiValueConverter 
{ 
    private static SizePartsToSizeConverter m_instance = new SizePartsToSizeConverter(); 
    public static SizePartsToSizeConverter Instance { get { return m_instance; } } 

    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var values = value.Where(x => x is Double).Cast<double>().ToList(); 
     if (values.Count()!=2) return DependencyProperty.UnsetValue; 

     return new Size(values[0],values[1]); 
    } 

    public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
相關問題