画布涵盖了metrowindow标题

时间:2017-12-14 06:34:02

标签: c# wpf canvas

我有一个项目是图片视图,允许用户在窗口中拖动图片,但这有问题。

当画布中的图片被拖到顶部时,它会覆盖标题。我不知道如何解决这个问题,请帮忙!!!

namespace OfficeStyleWindowProject
{

  public partial class Window1 : MetroWindow
  {
    public Window1()
    {
    }
    Point LastPos;
    private void Canvas_MouseMove(object sender, MouseEventArgs e)
    {
        //移动画布
        Point curr_pos = e.GetPosition(this);
        Canvas grid = sender as Canvas;

        if ((e.LeftButton == MouseButtonState.Pressed))
        {
            Matrix m = grid.RenderTransform.Value;
            m.Translate(curr_pos.X - LastPos.X, curr_pos.Y - LastPos.Y);
            grid.RenderTransform = new MatrixTransform(m);

        }

        LastPos = curr_pos;
    }

    private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        LastPos = e.GetPosition(this);
    }
  }
}


<Controls:MetroWindow x:Class="OfficeStyleWindowProject.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
    xmlns:Controls="http://metro.mahapps.com/winfx/xaml/controls"
    Title="Office Style Window" 
    Height="300" 
    Width="300" Panel.ZIndex="1000"
    WindowTitleBrush="Green">

    <Canvas Width="200" Height="200" 
        Background="Red"  
        MouseMove="Canvas_MouseMove" 
        MouseLeftButtonDown="Canvas_MouseLeftButtonDown">

    </Canvas>
</Controls:MetroWindow>

program started,and no drag

It's the problem, canvas covers the window title

1 个答案:

答案 0 :(得分:0)

您可以检查鼠标或矩形的位置,并检查窗口的位置。如果位置不合适,请不要重新渲染画布。

Point LastPos;
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
    Point curr_pos = e.GetPosition(this);
    Canvas grid = sender as Canvas;

    if ((e.LeftButton == MouseButtonState.Pressed))
    {
        double top = grid.GetTop();
        var diffY = curr_pos.Y - LastPos.Y;

        //If new position of canvas will be smaller then title bar size, do not transform.
        if((top + diffY) < 26)
            return;

        Matrix m = grid.RenderTransform.Value;
        m.Translate(curr_pos.X - LastPos.X, curr_pos.Y - LastPos.Y);
        grid.RenderTransform = new MatrixTransform(m);

    }

    LastPos = curr_pos;
}