Вы можете попробовать использовать конвертер на вашем сетере RenderTransformOrigin
Преобразователь примет элемент управления в качестве параметра и проверит, находится ли позиция элемента управления в его родительском элементе между 0 и (ControlHeight / 2), а затем вычисляет и возвращает другое значение RenderTransformOrigin. Если нет, просто верните значение по умолчанию (0.5,0.5)
Edit:
Чтобы ответить на ваш комментарий, я не уверен в точном синтаксисе, так как я не тестирую его, но я думал о чем-то похожем на следующее:
Создайте свой конвертер. Вероятно, это будет конвертер MultiBinding
public class RenderTransformConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
// Get parameters - You'll probably want to include validation and default values
UIElement control = (UIElement)value[0];
UIElement parent = (UIElement)value[1];
int controlHeight = control.Height;
int controlXPositionInParent = control.TranslatePoint(new Point(0, 0), parent).X;
if (controlXPositionInParent < (controlHeight * .5))
{
// Calculate a new render transform.
// Should verify I'm doing the math right, didn't get much sleep last night
return new Point(0.5, controlXPositionInParent / controlHeight);
}
else
{
return new Point(0.5, 0.5);
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Ваш XAML будет содержать строку для включения пространства имен конвертера и создания объекта нового конвертера.
<localNamespace:RenderTransformConverter x:Key="renderTransformConverter />
Тогда ваш стиль будет использовать его примерно так:
<Setter Property="RenderTransformOrigin">
<Setter.Value>
<MultiBinding Converter="{StaticResource renderTransformConverter}">
<Binding Path="{Binding RelativeSource=Self}" />
<Binding Path="{Binding RelativeSource=Self, Path=Parent}" />
</MultiBinding>
</Setter.Value>
Я не уверен, что вы можете передавать элементы управления в качестве параметров преобразователю, но если нет, вам, вероятно, придется переупорядочить параметры, чтобы получить любые значения, необходимые для расчета.