Новые измерения остаются такими же после применения ScaleTransfrom к свойству RenderTransfrom - PullRequest
0 голосов
/ 07 октября 2011

Я получаю те же размеры после того, как выполняю масштабирование transfrom для визуализированного свойства transfrom.Вот код:

 shape.Width = 100; shape.Height=100;
 shape.RenderTransform = new ScaleTransform(.5, .5);
 textBox.text = shape.ActualWidth + " " + shape.ActualHeight;

Я попытался получить ширину и высоту границ отображаемой геометрии, и все еще то же самое.Я также попробовал LayoutTransfrom, все еще не работал.Что я делаю не так, любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 07 октября 2011

Основное различие между LayoutTransform и RenderTransform заключается в применении преобразования. При использовании Render Transform полный размер объекта используется во время процесса макета, и только после того, как это закончено, объект трансформируется. Другие элементы не подвержены влиянию этого. С LayoutTransform объект уже трансформируется на этапе макета, что означает, что для всех намеченных целей ограничивающая рамка объекта изменяется. Все остальные элементы также адаптируются к этому изменению.

Ни то, ни другое не изменит ActualWidth или ActualHeight, так как это повлияет на внутреннюю компоновку преобразуемого объекта, что делает операцию преобразования бесполезной.

Вы можете увидеть это в следующем примере, который я для вас подготовил:

<StackPanel>
    <Border Name="OuterBorder1" HorizontalAlignment="Left" VerticalAlignment="Top" Background="Yellow">
        <Border Width="100" Height="100" Background="Green" Name="Border1" />
    </Border>
    <Button Content="Normal" Click="Normal_Click"/>
    <Button Content="Layout Transform" Click="Layout_Click"/>
    <Button Content="Render Transform" Click="Render_Click"/>
    <TextBlock Text="{Binding Path=ActualWidth, ElementName=Border1}"></TextBlock>
    <TextBlock Text="{Binding Path=ActualWidth, ElementName=OuterBorder1}"></TextBlock>
</StackPanel>

При нажатии кнопок выполняются следующие действия:

private void Normal_Click(object sender, RoutedEventArgs e)
{
    Border1.RenderTransform = new ScaleTransform(1, 1);
    Border1.LayoutTransform = new ScaleTransform(1, 1);
}

private void Layout_Click(object sender, RoutedEventArgs e)
{
    Border1.RenderTransform = new ScaleTransform(1, 1);
    Border1.LayoutTransform = new ScaleTransform(0.5, 0.5);
}

private void Render_Click(object sender, RoutedEventArgs e)
{
    Border1.LayoutTransform = new ScaleTransform(1, 1);
    Border1.RenderTransform = new ScaleTransform(0.5, 0.5);
}

OuterBorder1 имеет переопределение выравнивания, чтобы убедиться, что он плотно прилегает к элементу.

Как видите, с RenderTransform размер не изменяется. С LayoutTransform ширина преобразованного элемента остается прежней, но на контейнер, окружающий его, влияют.

0 голосов
/ 07 октября 2011

Попробуйте и дождитесь окончания преобразования, как мы его узнаем, используя быструю 1 милисекунду DoubleAnimation и событие Completed. В этом случае обработчик проверяет наличие новых измерений.

<Button x:Name="MyButton" Content="A Button"
  RenderTransformOrigin="0.5,0.5">
  <Button.RenderTransform>
    <RotateTransform x:Name="AnimatedRotateTransform" Angle="0" />
  </Button.RenderTransform>
  <Button.Triggers>
    <EventTrigger RoutedEvent="Button.Click">
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimation 
            Storyboard.TargetName="AnimatedRotateTransform"
            Storyboard.TargetProperty="Angle" 
            To="360" Duration="0:0:0.1" FillBehavior="Stop"
            Completed="RenderTransform_Completed" />
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Button.Triggers>
</Button>

Код позади ...

    private void RenderTransform_Completed(object sender, EventArgs e)
    {
        textBox.text = AnimatedRotateTransform.Angle;
    }
0 голосов
/ 07 октября 2011

Попробуйте установить LayoutTransform вместо RenderTransform.

...