我希望我的应用程序有一个Canvas
覆盖背景Image
。将包含可以通过拖放重新定位(设置、 )的Canvas
对象(TextBlocks
等) 。Top
Left
应用程序需要有一些大小调整选项:None
、Fill
、Uniform
。或者用户可以设置特定的维度。
当调整这些大小选项时Canvas
,Image
、 和所有子对象都需要重新调整大小,以便所有内容都能正确“缩放”。换句话说,除了背景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 保持其原始的顶部和左侧设置)。这不是我想要发生的。我希望它们相对于它们的原点重新定位。