WPF Canvas缩放转换

时间:2018-02-14 15:20:46

标签: c# wpf xaml canvas

我目前在WPF中遇到ItemsControl和canvas的问题。

我正在尝试做什么:

  • Points添加到ItemsControl并将其坐标存储为相对于此ItemsControl尺寸的百分比/分数
  • 将其加载到另一个ItemsControl中,其坐标为此新ItemsControl
  • 的百分比

我想要实现的目标:

  • ItemsControl ContainerA 是100乘100的平方。我在X = 10和Y = 10处添加了一个新的 P1 点。

  • 我保存 P1 ,X = 0.1,Y = 0.1( ContainerA 大小的10%)

  • 我在ItemsControl ContainerB 中加载 P1 ,500乘500的正方形,P1坐标应为x = 50且Y = 50( ContainerB 大小的10%

如何实现这一目标?

知道转换器不是一个选项,ScaleTransform也不是Points可能有助于显示文本/图片/任何内容,我不希望它们与新容器一起缩放。

任何提示都将不胜感激

1 个答案:

答案 0 :(得分:0)

我设法通过创建自定义ItemsControl和界面IScalableVm来获得我想要的东西。

public class ScaleItemsControl : ItemsControl
{
    protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
    {
        base.OnItemsChanged(e);
        ScaleItems();
    }

    protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
    {
        base.OnRenderSizeChanged(sizeInfo);
        ScaleItems();
    }

    private void ScaleItems()
    {
        foreach (var item in ItemsSource.OfType<IScalableVm>())
        {
            item.Scale(this.RenderSize.Width, this.RenderSize.Height);
        }
    }
}

然后我只是通过将它们的坐标与该容器的新宽度和高度相乘来缩放我的IScaleVms的坐标(例如我的点)。

public virtual void Scale(double width, double height)
{
    Position = new Point(width * _model.StartPosition.X, height * _model.StartPosition.Y);
}

远非完美。我仍然相信有一种方法可以用纯WPF风格做到这一点,但我不知道它