How can I make labels draggable from one panel to another with c# and wpf? -


i'm trying make text labels draggable, text floats above other elements drag 1 panel in c# wpf application.

my labels made array containing words in story so:

foreach (string word in lines) {    label mylabel = new label();    mylabel.content = word;    mylabel.name = "lbl" + x;    mylabel.fontsize = 30;    mylabel.margin = new thickness(0, -10, 0, -10);    mylabel.fontfamily = new fontfamily("segoe print");    mylabel.mousedown += new mousebuttoneventhandler(mylabel_mousedown);    mylabel.mousemove += new mouseeventhandler(mylabel_mousemove);    mylabel.mouseleftbuttonup += new mousebuttoneventhandler(mylabel_mouseleftbuttonup);    mylabel.mouseup += new mousebuttoneventhandler(mylabel_mouseup);    leftpanel.children.add(mylabel);    mylabelwidth.add(mylabel.actualwidth);    x++; } 

in events i'm trying figure out move label outside of it's containing panel another. in wpf can't understand how set label position mouse position on hold mouse down , move.

i have doesn't work @ all, looks this:

void mylabel_mousemove(object sender, mouseeventargs s) {    label mylabel = sender label    if(e.leftbutton == mousebuttonstate.pressed)    {       mylabel.left = e.getposition(this).x;       mylabel.top= e.getposition(this).y;    } } 

since far off, haven't gotten further. appreciated.

thanks.

there many ways implement drag/drop in wpf, , none of them trivial. example could:

  • add thumbs canvas , implement dragstart, dragcomplete , dragdelta
  • use adorners. article here.
  • use rendertransform , create translatetransform move control. , manually implement mousedown, mousemove , mouseup on window/usercontrol.

the following code uses rendertransform property of runtime generated labels move them around on screen user drags them mouse. limitation of example cannot have other transforms applied labels because overwritten. consider using transformgroup.

xaml

<window x:class="wpfapplication2.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" background="gray" previewmouseleftbuttondown="window_previewmouseleftbuttondown" previewmousemove="window_previewmousemove" previewmouseleftbuttonup="window_previewmouseleftbuttonup"> <grid> <itemscontrol itemssource="{binding labelscollection}">     <itemscontrol.itemspanel>         <itemspaneltemplate>             <stackpanel />         </itemspaneltemplate>     </itemscontrol.itemspanel>         <itemscontrol.itemtemplate>             <datatemplate>                 <label horizontalalignment="center" content="{binding}"></label>             </datatemplate>         </itemscontrol.itemtemplate>     </itemscontrol> </grid> 

code behind

public partial class mainwindow : window, inotifypropertychanged {     private list<dependencyobject> _hitresultslist = new list<dependencyobject>();     private point _currentlydraggedmouseoffset;     private label _currentlydragged;     private observablecollection<string> _labelscollection;     public event propertychangedeventhandler propertychanged;      public mainwindow()     {         datacontext = this;         initializecomponent();         labelscollection = new observablecollection<string>();          (int = 1; <= 10; i++)         {             labelscollection.add("label " + i);         }     }      public observablecollection<string> labelscollection     {         { return _labelscollection; }         set         {             _labelscollection = value;             if (propertychanged != null)             {                 propertychanged(this, new propertychangedeventargs("labelscollection"));             }         }     }      private void window_previewmousemove(object sender, mouseeventargs e)     {         if (_currentlydragged != null)         {                             var mousepos = e.getposition(this);             _currentlydragged.rendertransform = new translatetransform(mousepos.x - _currentlydraggedmouseoffset.x, mousepos.y - _currentlydraggedmouseoffset.y);         }     }      private void window_previewmouseleftbuttonup(object sender, mousebuttoneventargs e)     {         _currentlydragged = null;         releasemousecapture();     }      private void window_previewmouseleftbuttondown(object sender, mousebuttoneventargs e)     {         capturemouse();         point pt = e.getposition((uielement)sender);         _hitresultslist.clear();          visualtreehelper.hittest(this, null,             new hittestresultcallback(myhittestresult),             new pointhittestparameters(pt));          if (_hitresultslist.count > 0)         {             foreach (dependencyobject d in _hitresultslist)             {                 var parent = visualtreehelper.getparent(d);                 if (parent != null && parent label)                 {                     _currentlydragged = parent label;                     if (_currentlydragged.rendertransform translatetransform)                     {                         _currentlydraggedmouseoffset.x = e.getposition(this).x - ((translatetransform)_currentlydragged.rendertransform).x;                         _currentlydraggedmouseoffset.y = e.getposition(this).y - ((translatetransform)_currentlydragged.rendertransform).y;                     }                     else                     {                         _currentlydraggedmouseoffset.x = pt.x;                         _currentlydraggedmouseoffset.y = pt.y;                     }                      return;                 }             }         }         _currentlydragged = null;     }      // return result of hit test callback.      public hittestresultbehavior myhittestresult(hittestresult result)     {         _hitresultslist.add(result.visualhit);         return hittestresultbehavior.continue;     }  } 

Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -