Можно ли привязать не к свойству элемента, а к самому элементу в WPF? - PullRequest
0 голосов
/ 26 мая 2020

TransformA - это TranslateTransform, я бы хотел сделать что-то вроде этого:

<Setter Property="RenderTransform">
  <Setter.Value>
    <TransformGroup>
      <RotateTransform Angle="90"/>
      <TranslateTransform Self="{Binding TransformA}"/>  
    </TransformGroup>
  </Setter.Value>
</Setter>

Есть ли другой способ добиться этого?


Я знаю, что могу привязать один RenderTransform как это

<Path RenderTransform="{Binding TransformA}"/>

с Setter

<Setter Property="RenderTransform" Value="{Binding TransformA}"/>

или несколько преобразований с TransformGroup

<Setter Property="RenderTransform">
  <Setter.Value>
    <TransformGroup>
      <TranslateTransform X="5" Y="5"/>
      <RotateTransform Angle="90"/>
    </TransformGroup>
  </Setter.Value>
</Setter>

Ответы [ 2 ]

0 голосов
/ 02 июня 2020

Согласно ответу A sh, это невозможно. Вместо этого я заставил его работать, создав новый TransformGroup в выделенном коде и привязав этот

выделенный код:

public TransformGroup combinedTransformGroup {
  get {
    var transformGroup = new TransformGroup();
    if (TransformA != null)
      transformGroup.Children.Add(TransformA);
    transformGroup.Children.Add(new RotateTransform(90));
    return transformGroup;
    }
    set { }
}

XAML:

<Setter Property="RenderTransform" Value="{Binding combinedTransformGroup}"/>
0 голосов
/ 26 мая 2020

Привязка не может заменить целевой объект. Вы можете использовать MultiValueConverter - чтобы объединить несколько преобразований в одну TransformGroup:

public class TransformGroupConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var tg = new TransformGroup();

        foreach(Transform t in values.OfType<Transform>())
        {
            tg.Children.Add(t);
        }

        tg.Freeze();

        return tg;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

вот модификация разметки xaml с фиксированным RotateTransform и привязываемым TransformA:

<Setter Property="RenderTransform">
    <Setter.Value>
        <MultiBinding>
            <MultiBinding.Converter>
                <local:TransformGroupConverter/>
            </MultiBinding.Converter>

            <Binding>
                <Binding.Source>
                    <RotateTransform Angle="90"/>
                </Binding.Source>
            </Binding>

            <Binding Path="TransformA"/>
        </MultiBinding>
    </Setter.Value>
</Setter>

или просто привязать индивидуальные свойства:

<TranslateTransform X="{Binding TransformA.X}" Y="{Binding TransformA.Y}"/>  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...