运行时在窗体上拖动控件

Dragging Controls on Form at runtime(运行时在窗体上拖动控件)
本文介绍了运行时在窗体上拖动控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我刚刚开始使用 WPF.但我正在尝试添加我的代码(来自 Winforms),使用户能够在运行时将任何控件拖动到他们希望的任何位置.但我似乎无法获得鼠标的当前位置......嗯?鼠标没有位置?:(

I've just started using WPF. But I'm trying to add my code that (from Winforms) enables the user to drag any control whereever they wish at runtime. But I can't seem to get the current Location of the mouse... Eh? There is no Location for Mouse? :(

推荐答案

在鼠标事件中可以使用 e.GetPosition 获取当前鼠标位置.此函数可以提供相对于特定元素的鼠标位置,或者您可以只传递 null.

In the Mouse event you can use e.GetPosition to get the current mouse position. This function can provide the mouse position relative to a specific element or you can just pass null.

这是一个非常简单的例子,没有命中测试或任何东西,只是一个可以拖动的按钮.我使用了一个画布来保持它的简短,但您可能会更好地使用转换并将控件转换到所需的位置.

Here is a very simple example, no hit testing or anything, just a button that you can drag around. And I used a canvas to keep it short, but you would probably do better to use a transform and translate the control to the desired position.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Canvas PreviewMouseLeftButtonDown="Canvas_PreviewMouseLeftButtonDown" 
            PreviewMouseMove="Canvas_PreviewMouseMove" 
            PreviewMouseLeftButtonUp="Canvas_PreviewMouseLeftButtonUp">
        <Button Name="dragButton" Width="80" Height="21" Canvas.Left="50" Canvas.Top="10">Drag Me!</Button>
    </Canvas>
</Window>


using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApplication1
{
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();      
    }    

    private Point _startPoint;
    private bool _dragging = false;

    private void Canvas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {         
      if (dragButton.CaptureMouse())
      {        
        _startPoint = e.GetPosition(null);
        _dragging = true;        
      }
    }

    private void Canvas_PreviewMouseMove(object sender, MouseEventArgs e)
    {
      if (_dragging)
      {        
        Point newPoint = e.GetPosition(null);
        double dx = newPoint.X - _startPoint.X;
        double dy = newPoint.Y - _startPoint.Y;

        Canvas.SetLeft(dragButton, Canvas.GetLeft(dragButton) + dx);
        Canvas.SetTop(dragButton, Canvas.GetTop(dragButton) + dy);
        _startPoint = newPoint;
      }
    }

    private void Canvas_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
      if (_dragging)
      {        
        _dragging = false;
        dragButton.ReleaseMouseCapture();
      }
    }    
  }
}

这篇关于运行时在窗体上拖动控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

Force JsonConvert.SerializeXmlNode to serialize node value as an Integer or a Boolean(强制 JsonConvert.SerializeXmlNode 将节点值序列化为整数或布尔值)
Using JSON to Serialize/Deserialize TimeSpan(使用 JSON 序列化/反序列化 TimeSpan)
Could not determine JSON object type for type quot;Classquot;(无法确定类型“Class的 JSON 对象类型.)
How to deserialize a JSONP response (preferably with JsonTextReader and not a string)?(如何反序列化 JSONP 响应(最好使用 JsonTextReader 而不是字符串)?)
how to de-serialize JSON data in which Timestamp it-self contains fields?(如何反序列化时间戳本身包含字段的JSON数据?)
JSON.Net custom contract serialization and Collections(JSON.Net 自定义合约序列化和集合)