Почему моя привязка не обновляется для UIElement.RenderSize или UIElement.ActualWidth? - PullRequest
1 голос
/ 04 января 2010

Я пытаюсь привязать данные TextBlock к 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>

Когда я перемещаю ползунок, прямоугольник становится больше, и первый текстовый блок корректно обновляется. Однако 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 ]

2 голосов
/ 31 декабря 2012

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();
    }
}
2 голосов
/ 04 января 2010

Я написал ответ на похожий вопрос здесь:

Не работает привязка к ActualWidth

Это должно быть полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...