2017-02-22 13 views
0

Я создавал приложение WPF с Windows style = None, мне удалось создать и запустить кнопку выхода в моем окне, но я не знаю, как заставить его перетащить, нажав левую кнопку мыши. Я создал левую кнопку мыши вниз событие в .cs файл, как показано ниже:Как сделать перетаскиваемое окно WPF без стиля окон по умолчанию?

private void see(object sender, MouseButtonEventArgs e) 
{ 
    this.DragMove(); 
} 

Затем я добавил границу в .xaml файл, чтобы сделать перетаскиванием в окно, как показано ниже:

<Grid> 
    <Border BorderThickness="2" BorderBrush="Black" Height="120" Width="100" MouseLeftButtonDown="see" /> 
</Grid> 

Теперь я не Не понимаю, в чем проблема? Я буду очень благодарен, если кто-нибудь поможет мне в этом?

ответ

1

Используйте подобный шаблон для этого окна:

public class DragableWindowNoStyle : Window 
{ 

    public DragableWindowNoStyle() 
    { 
     WindowStyle = WindowStyle.None; 
     Grid grid = new Grid() { }; 
     _moveBorder = new Border() 
     { 
      BorderThickness = new Thickness(2), 
      BorderBrush = Brushes.Red, 
      Background = Brushes.Black, 
      Width = 50, 
      Height = 20, 
      HorizontalAlignment= System.Windows.HorizontalAlignment.Center, 
      VerticalAlignment = System.Windows.VerticalAlignment.Top, 
     }; 
     grid.Children.Add(_moveBorder); 
     this.Content = grid; 

     _moveBorder.PreviewMouseLeftButtonDown += _moveBorder_PreviewMouseLeftButtonDown; 
    } 

    Point _startPoint; 
    bool _isDragging = false; 
    Border _moveBorder; 

    private void _moveBorder_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     if (Mouse.Capture(this)) 
     { 
      _isDragging = true; 
      _startPoint = PointToScreen(Mouse.GetPosition(this)); 
     } 
    } 

    protected override void OnPreviewMouseMove(MouseEventArgs e) 
    { 
     if (_isDragging) 
     { 
      Point newPoint = PointToScreen(Mouse.GetPosition(this)); 
      int diffX = (int)(newPoint.X - _startPoint.X); 
      int diffY = (int)(newPoint.Y - _startPoint.Y); 
      if (Math.Abs(diffX) > 1 || Math.Abs(diffY) > 1) 
      { 
       Left += diffX; 
       Top += diffY; 
       InvalidateVisual(); 
       _startPoint = newPoint; 
      } 
     } 
    } 
    protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
     if (_isDragging) 
     { 
      _isDragging = false; 
      Mouse.Capture(null); 
     } 
    } 



} 
+0

Обратите внимание, что я отредактировал код и использовал ['' PointToScreen''] (https://msdn.microsoft.com/en-us/library/aa346961.aspx). – Ron

+0

нет, его не работает, не отображается никаких ошибок или предупреждений, только он не работает, должен ли я отправить свой проект вам? – jimmy

+0

@Jimmy Это не события, которые он добавил к границе, но которые переопределены в классе окон, вам не нужны эти события на границе, удалите все это и просто используйте код Внутри вашего класса окна. –

0

Существует пример того, как создать пользовательское окно с изменением размера, перетащить, свести к минимуму, восстановить и закрыть функциональность с нуля доступна здесь:

Как создать пользовательское окно в WPF:https://blog.magnusmontin.net/2013/03/16/how-to-create-a-custom-window-in-wpf/

Вы также можете настроить окно, сохраняя при этом своей стандартной функциональности с помощью WindowChrome класс: https://msdn.microsoft.com/en-us/library/system.windows.shell.windowchrome(v=vs.110).aspx. Тогда вам не нужно самостоятельно выполнять функции изменения размера и перетаскивания.

 Смежные вопросы

  • Нет связанных вопросов^_^