Как переместить панель сетки в окне WPF - PullRequest
2 голосов
/ 17 апреля 2009

HI

Как мне переместить (перетащить) панель сетки в окно WPF? Панель сетки не имеет позиции или местоположения или координат X и Y. Все, на что я смотрю, - это переместите панель сетки из ее текущего местоположения в новое местоположение с помощью мыши, чтобы отобразились элементы управления, которые «скрыты» под ней.

Есть указатели?

Большое спасибо.

Ответы [ 4 ]

13 голосов
/ 17 апреля 2009

Вот несколько примеров кода, с которых можно начать:

В XAML:

Создайте сетку и определите преобразование рендера на ней:

<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>

Назовите элемент управления, в который вы хотите переместить сетку:

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

В коде позади:

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();
}
2 голосов
/ 24 ноября 2015

На основании ответа Джоша Г

Ответ Джоша превосходен, если вы хотите переместить одну сетку, но не хватает возможностей для перемещения нескольких элементов.
Это как переместить несколько элементов отдельно

1010 * 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>

Код позади

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();
    }
0 голосов
/ 20 июня 2014
    public void dragme(object sender, MouseButtonEventArgs e)
    {
        if (_Move.IsChecked == true)
            db.Attach((DependencyObject)sender);

}

//// MouseDragElementBehavior db;

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

}

0 голосов
/ 18 апреля 2009

Просто поместите панель сетки внутри холста, а не прямо в окно - это даст ей координаты X / Y.

Затем вы можете реализовать поведение перетаскивания, используя настраиваемое свойство, например, подробно здесь (http://www.deepcode.co.uk/archive/2008/11/16/using-attached-properties-to-compose-new-behaviour.aspx)

...