在wpf中平移画布后保持画布的位置和大小

时间:2017-04-29 11:39:33

标签: c# wpf canvas drawing

我是新手,我正在尝试制作视觉图纸。我在这个画布上有一个画布和图像(由点击的事件创建的图像)。

代码XAML:

<Canvas Name="drawing" Background="Black"
            MouseDown="drawing_MouseDown"
            MouseMove="drawing_MouseMove"
            MouseUp="drawing_MouseUp">                             

        <Canvas.RenderTransform>
            <MatrixTransform/>
        </Canvas.RenderTransform>
    </Canvas>

代码隐藏:

namespace Panning_used_MatrixTransform
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private Point firstPoint = new Point();

        private void drawing_MouseDown(object sender, MouseButtonEventArgs e)
        {
            firstPoint = e.GetPosition(this);
            drawing.CaptureMouse();
        }
        private void drawing_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.MiddleButton == MouseButtonState.Pressed)
            {

                var lsPoint = e.GetPosition(this);
                var res = lsPoint - firstPoint;
                var element = sender as UIElement;                
                var transform = element.RenderTransform as MatrixTransform;
                var matrix = transform.Matrix;
                matrix.TranslatePrepend(res.X, res.Y);
                transform.Matrix = matrix;

                //udate first point
                firstPoint = lsPoint;
            }
        }
        private void drawing_MouseUp(object sender, MouseButtonEventArgs e)
        {
            drawing.ReleaseMouseCapture();
        }
    }
}

当我们平移此画布(如CAD绘图)时,我不知道如何保持画布的位置和大小不变。

更多信息: 我想创建一个允许在开始时我们在画布上什么都没有的软件。当我们单击一个按钮时,我们可以在画布上创建一些我们想要的图像。并且在开始时没有任何内容(因此在画布上没有任何内容 - XAML代码)。 请帮帮我!

1 个答案:

答案 0 :(得分:0)

根据您的要求,应该对图像而不是画布执行操作。因此,当您平移图像时,画布保持静止。

我对XAML代码进行了一些更改,添加了另一个用于测试的图像,还将事件从画布移动到外部网格,但我没有重命名事件处理程序,因此您可以更轻松地编译新代码。 / p>

<Grid Background="Black" 
      MouseDown="drawing_MouseDown"
      MouseMove="drawing_MouseMove"
      MouseUp="drawing_MouseUp">
    <Canvas Name="drawing">
        <Image x:Name="imgSource" Source="Resources/my-pic.png" 
           Height="100" Width="100" Canvas.Top="30" Canvas.Left="30">
            <Image.RenderTransform>
                <MatrixTransform/>
            </Image.RenderTransform>
        </Image>
        <Image x:Name="imgSource2" Source="Resources/my-pic.png" 
           Height="100" Width="100" Canvas.Top="230" Canvas.Left="230">
            <Image.RenderTransform>
                <MatrixTransform/>
            </Image.RenderTransform>
        </Image>
    </Canvas>
</Grid>

在后面的代码中,我将操作应用于画布的每个子元素。

我也删除CaptureMouse()/ReleaseMouseCapture(),因为我认为这两行不是必需的。

private void drawing_MouseMove(object sender, MouseEventArgs e)
{
    if (e.MiddleButton == MouseButtonState.Pressed))
    {
        var lsPoint = e.GetPosition(this);
        var res = lsPoint - firstPoint;

        foreach (UIElement element in drawing.Children)
        {
            var transform = element.RenderTransform as MatrixTransform;
            var matrix = transform.Matrix;
            matrix.TranslatePrepend(res.X, res.Y);
            transform.Matrix = matrix;
        }                

        //udate first point
        firstPoint = lsPoint;
    }
}