• C#拖拽控件


        写了这么些年程序,界面写的较少。实习被逼补了下。趁有空总结下。

        模仿着写了一个简单的拖拽相应命令的Demo。当鼠标点击屏幕时,生成一个红色的UI(这里用Rectangle表示),当点击Rectangle时,变成绿色,可以拖拽它。当松开它时,就会变成黄色。

    XAML里,我让它相应一个鼠标左键按下的命令。

      <Canvas x:Name="myCanvas" Background="White" MouseLeftButtonDown="myCanvas_MouseLeftButtonDown">

     </Canvas>

     

    看具体的代码:

    using System.Windows;

    usingSystem.Windows.Controls;

    using System.Windows.Input;

    using System.Windows.Media;

    usingSystem.Windows.Shapes;

    namespaceclickAndDragMouseEvents

    {

       public partialclass MainPage: UserControl

       {

           //Judge if the mouse is dragging some circles.

           private boolisDragging = false;

           //Store the offset between the click point andthe center of the ellipse

           private PointmouseOffset = new Point();

           public MainPage()

           {

                InitializeComponent();

           }

        //当有鼠标左键点击的Event发出时,处理这个Event,生成一个UIControl。这里选择一个矩形当做UI

     private voidmyCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

           {

                if(isDragging == false)

                {

                    CanvasmyCanvs = (Canvas)sender;

                    Rectanglerect = new Rectangle();

                    rect.Fill = new SolidColorBrush(Colors.Red);

                    rect.Height = 50;

                    rect.Width = 50;

                    PointclickPoint = e.GetPosition(this);

                    rect.SetValue(Canvas.LeftProperty, clickPoint.X - rect.Width /2);

                    rect.SetValue(Canvas.TopProperty, clickPoint.Y - rect.Height /2);

                    rect.MouseLeftButtonDown +=Ellipse_MouseLeftButtonDown;

                    myCanvas.Children.Add(rect);

                }

           }

        //当该UI Rectangle被选中(点击)时,做相应的处理。比如通过强制转换sender来获取被点击的UI;修改它的颜色(或者别的你需要的操作);使用+=操作符来订阅鼠标移动,鼠标左键点击等事件;

    private void Ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgse)

           {

                if(isDragging == false)

                {

                    isDragging = true;

                    Rectangleellipse = (Rectangle)sender;//看是哪个UI被选中了。

                    ellipse.Fill = new SolidColorBrush(Colors.Green);

                    ellipse.MouseMove += Ellipse_MouseMoving;//订阅鼠标移动消息

                    ellipse.MouseLeftButtonUp +=Ellipse_MouseLeftButtonUp;

                    mouseOffset =e.GetPosition(ellipse);

                    ellipse.CaptureMouse();//如果没有CaptureMouse(),那么当鼠标移动过快离开了该UI范围后,该UI就相应不到鼠标的事件了。

                }

           }

          //随着鼠标的移动来移动UI的位置。

           private voidEllipse_MouseMoving(object sender, MouseEventArgs e)

           {

                if(isDragging == true)

                {

                    Rectangleellipse = (Rectangle)sender;

                    ellipse.SetValue(Canvas.LeftProperty, e.GetPosition(this).X - mouseOffset.X);

                    ellipse.SetValue(Canvas.TopProperty, e.GetPosition(this).Y - mouseOffset.Y);

                }

           }

     

    //当鼠标左键松开了,做相应的处里,比如让UI不再相应鼠标事件了。

     private voidEllipse_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)

           {

                if(isDragging == true)

                {

                    isDragging = false;

                    Rectangleellipse = (Rectangle)sender;

                    ellipse.SetValue(Canvas.LeftProperty, e.GetPosition(this).X - mouseOffset.X);

                    ellipse.SetValue(Canvas.TopProperty, e.GetPosition(this).Y - mouseOffset.Y);

                    ellipse.Fill = new SolidColorBrush(Colors.Orange);

                    ellipse.ReleaseMouseCapture();

                }

           }

       }

    }

     

  • 相关阅读:
    引用赋值的问题
    mysql的笔记
    输入法失败
    eclipse的快捷键
    c++/c在两个文件公用一个变量
    用c++ sttring检测名字是否有空格
    QLineEdit的信号函数
    c++博客转载
    qt-博客
    QT聊天室--重大bug
  • 原文地址:https://www.cnblogs.com/bester/p/3255769.html
Copyright © 2020-2023  润新知