如何确定应用缩放变换后的控件大小?

3

如何在应用变换后确定控件的实际宽度和实际高度?

例如,我认为以下XAML代码应该显示像400x400这样的大小(例如,在图片中,红色矩形的宽度为400),但是宽度和高度都等于200。

我做错了什么?

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Class="VisualCad.Components.TempVisualTests.MainWindow"
    mc:Ignorable="d"
    x:Name="MyWin"
    Title="MainWindow" WindowState="Maximized" Height="500" Width="500">

    <Grid>
        <Rectangle Width="400" Height="5" Fill="Red" Margin="0,20,0,0" VerticalAlignment="Top"/>

        <Canvas x:Name="MyCanvas" Width="200" Height="200">
            <Canvas.RenderTransform>
                <ScaleTransform CenterX="100" CenterY="100" ScaleX="2" ScaleY="2" />
            </Canvas.RenderTransform>

            <StackPanel>
                <TextBlock Text="{Binding Path=RenderSize, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Canvas}}, StringFormat='Render size: {0}'}" />
                <TextBlock Text="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Canvas}}, StringFormat='ActualWidth: {0}'}" />
                <TextBlock Text="{Binding Path=ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Canvas}}, StringFormat='ActualHeight: {0}'}" />
            </StackPanel>
        </Canvas>
    </Grid>
</Window>


你在这里的实际目标是什么?你需要这些信息做什么? - 15ee8f99-57ff-4f92-890c-b56153
@EdPlunkett 在任何变换之后,为了正确地排列我的控件,请进行适当的控制。 - slavka
2个回答

3
这段代码在我这里可行:
var parent = element.Parent as UIElement;

Point bottomLeft = element.TranslatePoint(new Point(0, 0), parent);
Point topRight = element.TranslatePoint(new Point(element.ActualWidth, element.ActualHeight), parent);

var renderWidth = topRight.X - bottomLeft.X;
var renderHeight = topRight.Y - bottomLeft.Y;

1

如何确定应用变换后控件的实际宽度和实际高度?

您需要自己计算宽度和高度。不过这应该相当简单:

double width = MyCanvas.ActualWidth;
double height = MyCanvas.ActualHeight;

ScaleTransform st = MyCanvas.RenderTransform as ScaleTransform;
if(st != null)
{
    width *= st.ScaleX;
    height *= st.ScaleY;
}

没有任何属性可以为您返回此大小。变换不会影响“ActualWidth”和“ActualHeight”属性。

在这种情况下,ScaleTransform只是一个示例,在变换之后,我们需要一些操作来获取控件的实际大小。 - slavka
答案仍然是一样的:你需要计算大小。我给了你一个例子,告诉你如何做这个,所以我不知道你还在问什么。 - mm8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接