代码之家  ›  专栏  ›  技术社区  ›  Nicolas Dorier

为什么我的绑定在UIElement.RenderSize或UIElement.ActualWidth上不更新?

  •  1
  • Nicolas Dorier  · 技术社区  · 16 年前

    我正在尝试将文本块数据绑定到矩形的渲染。这是代码。

    <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>
    

    当我移动滑块时,rect变大,第一个文本框正确更新。

    当我单击按钮时,我会以编程方式获取渲染器并在最后一个文本块中显示它,这与0,0不同。

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

    因此,我在RenderSize上的绑定无法正确更新文本框。。。为什么? 谢谢你的帮助,

    2 回复  |  直到 16 年前
        1
  •  3
  •   nicolas2008    13 年前

    不是依赖项属性,但它对应于依赖项属性 (实际宽度,实际高度)

    因此,要绑定到RenderSize,我们可以使用多绑定到(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();
        }
    }
    
    推荐文章