Wpf 在RenderTransform属性上应用ScaleTransfrom后,新维度仍然相同
在对渲染transfrom属性执行缩放变换后,我得到了相同的维度。代码如下:Wpf 在RenderTransform属性上应用ScaleTransfrom后,新维度仍然相同,wpf,rendering,height,width,transform,Wpf,Rendering,Height,Width,Transform,在对渲染transfrom属性执行缩放变换后,我得到了相同的维度。代码如下: shape.Width = 100; shape.Height=100; shape.RenderTransform = new ScaleTransform(.5, .5); textBox.text = shape.ActualWidth + " " + shape.ActualHeight; 我已经尝试获取渲染几何体边界的宽度和高度,但仍然相同。我也试过了,还是没用。如果我做错了什么,我们将不胜感激 尝试
shape.Width = 100; shape.Height=100;
shape.RenderTransform = new ScaleTransform(.5, .5);
textBox.text = shape.ActualWidth + " " + shape.ActualHeight;
我已经尝试获取渲染几何体边界的宽度和高度,但仍然相同。我也试过了,还是没用。如果我做错了什么,我们将不胜感激 尝试设置LayoutTransform而不是RenderTransform。LayoutTransform和RenderTransform之间的主要区别在于应用转换的时间。使用“渲染变换”(Render Transform)时,对象的完整大小将在布局过程中使用,并且只有在布局过程完成后,才会变换对象。其他因素也受此影响。使用LayoutTransform,对象已在布局阶段转换,这意味着对于所有预期目的,对象的边界框都会更改。所有其他元素也适应这种变化 两者都不会更改实际宽度或实际高度,因为这会影响正在变换的对象的内部布局,从而使变换操作无效 您可以在我为您准备的以下示例中看到这一点:
<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>
外订单1在对齐时有一个覆盖,以确保它紧密地安装在项目周围
如您所见,使用RenderTransform时,大小都不会改变。使用LayoutTransform时,变换元素的宽度保持不变,但其周围的容器会受到影响。尝试等待变换完成,我们可以通过使用快速1毫秒的DoubleAnimation及其完成的事件来了解它。在此事件处理程序中,检查新维度
<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>
您还需要等待变换应用完毕。即,在单独的调度程序消息中。尝试在对Dispatcher.BeginInvoke的调用中执行textBox.text分配。。。
<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;
}