движения мыши в wpf - PullRequest
       1

движения мыши в wpf

0 голосов
/ 22 марта 2012

Есть ли способ использовать щелчок мыши и перетащить в wpf? Я отключил границы моего приложения в коде xaml, но в коде позади я пытаюсь сделать что-то вроде этого:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;


namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Size? _mouseGrabOffset;


        public MainWindow()
        {
            InitializeComponent(); 
        }
        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Right)
                _mouseGrabOffset = new Size(e.Location);
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
                _mouseGrabOffset = new Size(e.Location);
            base.OnMouseDown(e);
        }
        protected override void OnMouseUp(MouseEventArgs e)
        {
            _mouseGrabOffset = null;

            base.OnMouseUp(e);
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (_mouseGrabOffset.HasValue)
            {
                this.Location = Cursor.Position - _mouseGrabOffset.Value;
            }

            base.OnMouseMove(e);
        }

В основном потому, что мои границы и строка заголовка отключены, этот код должен позволять контролировать приложение в любом месте, где я нажимаю.

Я просто не могу заставить его работать, потому что это основано на формах Windows.

EDIT

Если я попытаюсь это сделать, я получу ошибку определения, но я не уверен, как еще ее исправить:

public partial class MainWindow : Window
{
    private Size? _mouseGrabOffset;


    public MainWindow()
    {
        InitializeComponent();
        this.MouseDown += new MouseButtonEventHandler(MainWindow_OnMouseDown);

    }
    void MainWindow_OnMouseDown(object sender, MouseEventArgs e)
    {
        if (e.LeftButton != MouseButtonState.Pressed)
            _mouseGrabOffset = new Size(e.Location);
            base.OnMouseMove(e);
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (_mouseGrabOffset.HasValue)
        {
            this.Location = Cursor.Position - _mouseGrabOffset.Value;
        }

        base.OnMouseMove(e);
    }

РЕДАКТИРОВАТЬ

Итак, я попробовал новый метод, как упомянуто ниже, но все еще ничего.

public partial class MainWindow : Window
{
    //private Size? _mouseGrabOffset;


    public MainWindow()
    {
        InitializeComponent();
        //this.MouseDown += new MouseButtonEventHandler(MainWindow_OnMouseDown);

    }
    public enum MouseButtonType 
    {
        Left,
        Middle,
        Right,
        XButton1,
        XButton2,

    }
    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);
    }
    protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
    {
        base.OnPreviewMouseDown(e);
    }

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

В коде вашего окна вы переопределяете OnMouseDown и / или OnPreviewMouseDown

protected override void OnMouseDown(MouseButtonEventArgs e)
{
    base.OnMouseDown(e);
}
protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
{
    base.OnPreviewMouseDown(e);
}

Во-вторых, проверьте свойство MouseButtonEventArgs ChangedButton, чтобы определить, какая кнопка была нажата.public enum MouseButton (Left, Middle, Right, XButton1, XButton2} Соответствующее пространство имен - System.Windows.Input; System.Windows.Forms неверно.

Ваше окно не должно подписываться на собственные события, как предлагалось ранееИспользуйте переопределения. This.MouseDown + = new MouseButtonEventHandler (MainWindow_OnMouseDown); // Неверно

1 голос
/ 22 марта 2012

В дополнение к другому ответу вы регистрируетесь для подобных событий в коде:

  public MainWindow()
  {
      InitializeComponent(); 
      this.MouseDown += new MouseButtonEventHandler(MainWindow_MouseDown);
  }
  void MainWindow_MouseDown(object sender, MouseButtonEventArgs e)
  { 
        //handle it
  }

Или зарегистрируйтесь в XAML:

<Window x:Class="WpfApplication1.MainWindow"
        ...
        MouseDown="Window_MouseDown">
0 голосов
/ 22 марта 2012

Соответствующие события WPF находятся в пространстве имен System.Windows.Input .В частности, MouseDown прикрепленное событие , MouseUp прикрепленное событие и MouseMove присоединенное событие .Чтобы узнать, какая кнопка была нажата, вы используете ChangedButton свойство из MouseButtonEventArgs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...