1

我希望我的应用程序有一个Canvas覆盖背景Image。将包含可以通过拖放重新定位(设置、 )的Canvas对象(TextBlocks等) 。TopLeft

应用程序需要有一些大小调整选项:NoneFillUniform。或者用户可以设置特定的维度。

当调整这些大小选项时CanvasImage、 和所有子对象都需要重新调整大小,以便所有内容都能正确“缩放”。换句话说,除了背景Image缩放之外,拖放项目还需要正确重新定位。

我开始使用 Viewbox 作为“容器”控件,一切似乎都可以“缩放”,将 Stretch 属性设置为 None、Fill、Uniform 选项。

<Viewbox x:Name="Viewbox">
   <Grid>
      <Image x:Name="Image" Stretch="Fill" Source="Background.bmp" />
      <Canvas x:Name="Canvas" Background="Transparent">
         <TextBlock Text="Test1" Background="Gray" Canvas.Top="170" Canvas.Left="50" />
         <TextBlock Text="Test2" Background="Gray" Canvas.Top="225" Canvas.Left="80" />
         <TextBlock Text="Test3" Background="Gray" Canvas.Top="170" Canvas.Left="150" />
      </Canvas>
   </Grid>
</Viewbox>

private void StretchModeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   this.Viewbox.Stretch = (Stretch)this.StretchModeComboBox.SelectedValue;
}

为了实现特定的尺寸大小,我天真地更改了 Canvas、Image 和 Viewbox 上的尺寸。这里的问题是拖放对象没有正确重新定位。它们保持原来的顶部、左侧设置,这是不正确的。

private void ResizeButton_Click(object sender, RoutedEventArgs e)
{
   this.Viewbox.Stretch = Stretch.None;

   this.Viewbox.Height = this.Canvas.Height = this.Image.Height = Convert.ToDouble(this.HeightTextBox.Text);
   this.Viewbox.Width = this.Canvas.Width = this.Image.Width = Convert.ToDouble(this.WidthTextBox.Text);
}

为了实现特定的尺寸功能,我想我需要使用 ScaleTransform 来模拟高度/宽度的变化?这听起来像是正确的方法吗?这样,当用户输入特定尺寸时,一切都会缩放。

如何将特定尺寸(高度/宽度)转换为参数以传递给比例变换?

这是具有默认大小选项的应用程序(注意带有灰色背景的 TextBlocks - Test1、Test2、Test3)

在此处输入图像描述

这是设置了 Fill 选项的应用程序(再次注意 TextBlocks 仍然存在)。

在此处输入图像描述

最后,这是设置了特定尺寸 (1000 x 1000) 的应用程序(请注意,TextBlocks 保持其原始的顶部和左侧设置)。这不是我想要发生的。我希望它们相对于它们的原点重新定位。

在此处输入图像描述

4

0 回答 0