【问题标题】:Why my binding does not update on UIElement.RenderSize or UIElement.ActualWidth? [duplicate]为什么我的绑定在 UIElement.RenderSize 或 UIElement.ActualWidth 上没有更新? [复制]
【发布时间】:2010-01-04 20:10:32
【问题描述】:

我正在尝试将 TextBlock 数据绑定到 Rectangle 的 RenderSize。这是代码。

<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 变大,并且第一个 TextBox 正确更新。 但是,ActualWidth 和 RenderSize 保持为 0 和 0,0。

当我单击 Button 时,我以编程方式获取 RenderSize 并将其显示在最后一个 TextBlock 中,它不同于 0,0。

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

所以我对 RenderSize 的绑定没有正确更新 TextBox... 为什么? 感谢您的帮助,

【问题讨论】:

  • 我在这里写了一个类似问题的答案:stackoverflow.com/questions/1602148/…它应该对你有用。
  • 又一次在 silverlight 中被破解,它开始让我发疯了......
  • 如果您只处理元素上的 SizeChanged 事件并在事件处理程序中根据需要更新值,这可能会更容易。我链接到的帖子中描述的解决方案仅在您必须使用数据绑定时才需要。

标签: .net silverlight


【解决方案1】:

RenderSize不是依赖属性,而是对应依赖属性(ActualWidth, ActualHeight)

所以要绑定到 RenderSize,我们可以使用 MultiBinding to (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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2015-09-11
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多