Не могу перетащить и переместить форму WPF - PullRequest
17 голосов
/ 19 ноября 2009

Я создаю форму WPF с Window Style = Нет. Поэтому я не могу видеть перетащить панель в форме. Как я могу переместить форму с помощью свойства WindowStyle = None?

Ответы [ 5 ]

53 голосов
/ 22 февраля 2010

Я использую главное окно для хранения страниц (создаю программу стиля навигации), и в коде моего главного окна я вставил это ...

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
    base.OnMouseLeftButtonDown(e);

    // Begin dragging the window
    this.DragMove();
}

... и это работает как шарм. Это с windowstyle = нет. Это приятно в том смысле, что вы можете щелкнуть в любом месте приложения и переместить его, а не просто ограничиться верхней панелью.

6 голосов
/ 19 ноября 2009

См. этот вопрос .

В основном для этого используется метод Window.DragMove .

5 голосов
/ 18 декабря 2009

В нашем приложении Windows с WindowStyle, установленным на «none», мы реализовали функциональность для перетаскивания окна, но только из заголовка, а не из любой точки окна. Мы сделали это, добавив границу в качестве заголовка, а затем добавив большой палец, чтобы заполнить всю границу. Затем мы обрабатываем метод DragDelta для большого пальца в коде для окна.

<Border 
        Name="headerBorder" 
        Width="Auto" 
        Height="50" 
        VerticalAlignment="Top"
        CornerRadius="5,5,0,0" 
        DockPanel.Dock="Top" 
        Background="{StaticResource BackgroundBrush}" 
        BorderThickness="1,1,1,1"
        BorderBrush="{StaticResource BorderBrush}">
        <Grid>
            <Thumb 
                x:Name="headerThumb" 
                Opacity="0" 
                Background="{x:Null}" 
                Foreground="{x:Null}" 
                DragDelta="headerThumb_DragDelta"/>
        </Grid>
    </Border>

Тогда в коде есть следующий обработчик событий ...

private void headerThumb_DragDelta(object sender, DragDeltaEventArgs e)
{
    Left = Left + e.HorizontalChange;
    Top = Top + e.VerticalChange;
}

Я не знаю, лучше ли это, чем другой метод, просто так, как мы это сделали.

3 голосов
/ 30 ноября 2013

либо в окнах при загрузке, либо в сетке при загрузке, используйте deligate для запуска метода DragMove () при щелчке мыши

private void Grid_Loaded(object sender, RoutedEventArgs e)
{
            this.MouseLeftButtonDown += delegate{DragMove();};
}
0 голосов
/ 23 июня 2019

Если вы просто добавите this.DragMove(); и используете Bing Maps, то при попытке панорамирования карты вы получите некоторое разочаровывающее поведение.

Использование Ответ TabbyCool было хорошим решением, однако вы не можете перетащить окно к верхней части экрана, чтобы развернуть его.

Мое решение состояло в том, чтобы просто проверить, что позиция .Y моего клика относительно моей сетки верхних баров была меньше подходящей суммы.

 protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonDown(e);

        Point pt = e.GetPosition(topBar);

        Debug.WriteLine(pt.Y);

        if (pt.Y < topBar.ActualHeight)
        {
            DragMove();
        }
    }
...