C# 如何在 WPF 窗口中移动网格面板

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/759160/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 00:07:00  来源:igfitidea点击:

How to move a Grid Panel in WPF Window

c#wpfgridmove

提问by Anand Shah

HI,

你好,

How do I move (drag) a Grid Panel inside a WPF Window? The Grid Panel does not have a Position or Location or X and Y coordinate porperty. All I am looking at is to move the Grid Panel from its current location to a new location using Mouse so that the controls that are "burried" underneath it will show up.

如何在 WPF 窗口内移动(拖动)网格面板?网格面板没有位置或位置或 X 和 Y 坐标属性。我所看到的只是使用鼠标将网格面板从其当前位置移动到新位置,以便“隐藏”在其下方的控件将显示出来。

Any pointers?

任何指针?

Many Thanks.

非常感谢。

采纳答案by Josh G

Here's some code examples to get you started:

下面是一些帮助您入门的代码示例:

In XAML:

在 XAML 中:

Create a grid and define a render transform on it:

创建一个网格并在其上定义渲染变换:

<Grid x:Name="grid" Background="Blue" 
      Width="100" Height="100" 
      MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp">
    <Grid.RenderTransform>
        <TranslateTransform x:Name="tt"/>
    </Grid.RenderTransform>
</Grid>

Name the control that you want the grid to move within:

命名您希望网格在其中移动的控件:

<Window x:Name="window" ...>
    <Grid x:Name="grid"...
</Window>

In code behind:

在后面的代码中:

Point m_start;
Vector m_startOffset;

private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
    m_start = e.GetPosition(window);
    m_startOffset = new Vector(tt.X, tt.Y);
    grid.CaptureMouse();
}

private void Grid_MouseMove(object sender, MouseEventArgs e)
{
    if (grid.IsMouseCaptured)
    {
        Vector offset = Point.Subtract(e.GetPosition(window), m_start);

        tt.X = m_startOffset.X + offset.X;
        tt.Y = m_startOffset.Y + offset.Y;
    }
}

private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
{
    grid.ReleaseMouseCapture();
}

回答by deepcode.co.uk

Just put the grid panel inside a canvas rather than directly into the window - this will then give it X/Y co-ordinates.

只需将网格面板放在画布中而不是直接放入窗口中 - 这将为其提供 X/Y 坐标。

You can then implement the drag/drop behaviour using a custom attached property such as detailed here (http://www.deepcode.co.uk/archive/2008/11/16/using-attached-properties-to-compose-new-behaviour.aspx)

然后,您可以使用自定义附加属性实现拖放行为,例如此处详述(http://www.deepcode.co.uk/archive/2008/11/16/using-attached-properties-to-compose-new -behaviour.aspx

回答by LZara

    public void dragme(object sender, MouseButtonEventArgs e)
    {
        if (_Move.IsChecked == true)
            db.Attach((DependencyObject)sender);

}

}

//// MouseDragElementBehavior db;

//// MouseDragElementBehavior db;

 private void canvass_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    {
if (_Move.IsChecked == true && filmgrid.Visibility == Visibility.Visible)// == true)  
            {
                filmgrid.PreviewMouseDown += new MouseButtonEventHandler(dragme); 
            }

}

}

回答by HPaulson

Based on Josh G's answer

基于 Josh G 的回答

Josh's answer is excellent if you want to move one grid, but lacks capabilities for movement of several elements.
This is how to move several elements separately

如果您想移动一个网格,但缺乏移动多个元素的功能,Josh 的回答非常好。
这是分别移动几个元素的方法

XAML

XAML

<Grid x:Name="gridHost">
    <Grid x:Name="gridBlue" Background="Blue" Width="100" Height="100" MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp" Margin="-100,0,0,0">
        <Grid.RenderTransform>
            <TranslateTransform/>
        </Grid.RenderTransform>
    </Grid>
    <Grid x:Name="gridRed" Background="Red" Width="100" Height="100" MouseDown="Grid_MouseDown" MouseMove="Grid_MouseMove" MouseUp="Grid_MouseUp" Margin="100,0,0,0">
        <Grid.RenderTransform>
            <TranslateTransform/>
        </Grid.RenderTransform>
    </Grid>
</Grid>

Code behind

背后的代码

Point m_start;
    Vector m_startOffset;

    private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
    {
        FrameworkElement element = sender as Grid;
        TranslateTransform translate = element.RenderTransform as TranslateTransform;

        m_start = e.GetPosition(gridHost);
        m_startOffset = new Vector(translate.X, translate.Y);
        element.CaptureMouse();
    }

    private void Grid_MouseMove(object sender, MouseEventArgs e)
    {
        FrameworkElement element = sender as Grid;
        TranslateTransform translate = element.RenderTransform as TranslateTransform;

        if (element.IsMouseCaptured)
        {
            Vector offset = Point.Subtract(e.GetPosition(gridHost), m_start);

            translate.X = m_startOffset.X + offset.X;
            translate.Y = m_startOffset.Y + offset.Y;
        }
    }

    private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
    {
        FrameworkElement element = sender as Grid;
        element.ReleaseMouseCapture();
    }