Wpf Thumb obiektum C# kódból

Wpf Thumb obiektum C# kódból
2013-03-01T11:02:28+01:00
2013-03-03T11:09:36+01:00
2022-11-28T10:35:39+01:00
ciw
Sziasztok!

Ha egy canvas-hoz xaml-ben hozzáadok egy Thumb obiektumot a megfelelő DragDelta eseménykezeléssel, akkor a Thumb-omat szépen tudom húzgálni a canvas-ban.

Ha ugyanezt c# kódból teszem meg, akkor megjelenik a Thumb, de nem tudom arrébhúzni, nem mozdul, pedíg az DragDelta meghívódik.

Mi lehet a baj?
Az XAML kód:

<Canvas Name="myCanvas" Background="#FFFFFFE2" Margin="0,18,177,113" PreviewMouseDown="myCanvasStretch_PreviewMouseDown" MouseMove="myCanvas_MouseMove" MouseUp="myCanvas_MouseUp"> <TextBlock Canvas.Left="59" Canvas.Top="155" Height="23" Name="changes" Text="TextBlock" /> <Thumb Name="myThumb1" DragDelta="myThumb_DragDelta" Width="20" Height="20" Canvas.Left="14" Canvas.Top="89" /> <Button Canvas.Left="122" Canvas.Top="41" Content="Button" Height="23" Name="button1" Width="75" /> <Button Canvas.Left="274" Canvas.Top="41" Content="Button" Height="23" Name="button2" Width="75" /> </Canvas>

A C# kód:

Thumb th = new Thumb(); th.Width = 20; th.Height = 20; th.DragDelta += new DragDeltaEventHandler(myThumb_DragDelta); th.MouseEnter += new MouseEventHandler(th_MouseEnter); th.MouseLeave += new MouseEventHandler(th_MouseLeave); this.myCanvas.Children.Add(th);

Az eseménykezelés:

private void myThumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) { Thumb thumb = e.Source as Thumb; Canvas.SetLeft(thumb, Canvas.GetLeft(thumb) + e.HorizontalChange); Canvas.SetTop(thumb, Canvas.GetTop(thumb) + e.VerticalChange); changes.Text = e.HorizontalChange.ToString()+" : "+e.VerticalChange.ToString(); }

A válaszokat előre is köszönöm!
Nekem a mindenképp c# kódból kellene a Thumb-ot kezelni.
Mutasd a teljes hozzászólást!
ezt még szúrd be a létrehozáskor
Canvas.SetLeft(th, 0);
Canvas.SetTop(th, 0);
Mutasd a teljes hozzászólást!

  • Sajnos nem jó.

    Rájöttem valamire:

    Ha ellipszist adok át a thumbnak template ként, akkor meg sem jelenik, és nem is húzható nincs ott.

    Ha egy label-t adok át a thumbnak template ként, akkor nem jelenik meg, de arrébhúzható, tehát ott van de nem látszik. (textblockba írom a dragdelta változást).

    Ha egy buttont-adok át neki template ként, akkor látszik, de nem húzható odébb.

    Márpedíg én saját usercontrolt akarok majd thumb-ként megjeleníteni.

    Lehet a template átadás nem jó?

    //Instantiate a new ThumbTemplate and ElementFactory with my user control. var myThumbTemplate = new ControlTemplate(typeof(Thumb)); Ellipse el = new Ellipse(); el.StrokeThickness = 4; el.Stroke = Brushes.SteelBlue; el.Height = 20; el.Width = 20; el.Name = "el1"; //myCanvas.Children.Add(el); myThumbTemplate.VisualTree = new FrameworkElementFactory(typeof(Ellipse), "el1"); //Set the thumb template to the newly instantiated template. Thumb th = new Thumb(); // Set some arbitrary visual characteristics. th.Template = myThumbTemplate; th.Width = 20; th.Height = 20; th.Name = "Thumb"; //th.Background = new SolidColorBrush(Colors.MediumBlue); th.DragDelta += new DragDeltaEventHandler(myThumb_DragDelta); th.MouseEnter += new MouseEventHandler(th_MouseEnter); th.MouseLeave += new MouseEventHandler(th_MouseLeave); Canvas.SetLeft(th, 10); Canvas.SetTop(th, 0); myCanvas.Children.Add(th);
    Mutasd a teljes hozzászólást!
  • Dante vélasz a jó, mert az első kérdésdre válaszol helyesen.

    A MÁSODIK problémára:


    FrameworkElementFactory ellipse = new FrameworkElementFactory(typeof(Ellipse)); ellipse.SetValue(Ellipse.FillProperty, Brushes.Red); ellipse.SetValue(Ellipse.StrokeThicknessProperty, 2d); ellipse.SetValue(Ellipse.StrokeProperty, Brushes.Blue); ControlTemplate controlTemplate = new ControlTemplate(typeof(Thumb)); controlTemplate.VisualTree = ellipse; Thumb th = new Thumb(); th.Template = controlTemplate;

    Templateket/Stylokat érdemes Xaml-ben definiálni.
    Mutasd a teljes hozzászólást!
  • Igaz! dante válasza tényleg jó.


    Templateket/Stylokat érdemes Xaml-ben definiálni.

    De én magam készitett usercontrolokat akarok használni, amiknek a paraméterei időben változhanak, ráadásul elég bonyolultak, rengeteg eseményt kezelnek le. Ezt hogy tegyem előre be egy Xaml-be?.
    A google is csak Xaml-példákat hoz fel.

    Az általad eszközölt módosítással működik az ellipszis és mondjuk a label -lel is, de egy buttonnal nem működik.

    Nekem az a lényeg, hogy a user arréb tudja tologatni a controlokat.
    Mutasd a teljes hozzászólást!
  • A buttont azért nem tudod mozgatni, mert a click eseménye elkapja a mouseleftbuttondown eseményt, és mivel previewdragdelta nincs más megközelítést kell alkalmaznod ha csak egy buttont akarsz mozgatni.

    Nem értem pontosan, hogy mit akarsz csinálni, mit akarsz mozgatni a canvason. Tudsz készíteni UserControlokat és egyedi controlokat, amiknek olyan (Dependency)Property-ket és egyed RoutedEvent-eket adsz amilyeneket akarsz és úgy és akkor paraméterezed/kötöd(DataBinding) őket ahogy nem szégyelled.
    Mutasd a teljes hozzászólást!
  • Értem, sejtettem, hogy a click kavar be.

    Az általam készített usercontrol-nak is van click eseménye és nem is egy ponton.
    De nem tudom, hogyan adhatnék neki dragdelta eseményt, mert ugye a saját usercontrolomat a UserControl osztályból származtatom és ott sincs dragdelta.

    A lényeg az, hogy a usercontroljaimnak van több pontja, amiket össze lehet kötni egy másik ilyen usercontrol pontjaival(ezt a felhasználó köti össze) és ezeket a usercontrolokat szeretném én tologatni a canvason. A mellékelt kép talán többet mond.
    Drag-Drop módon már megcsináltam, de azt olvastam, hogy igazából erre a dologra a Thumb-ok valók és nem akarok kókányolni.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Ezt a feladatot én nem UserControl-lal oldanám meg. Az UC-t szerintem nem erre találták ki. Egyszerűen egy thumbot származtatsz és hozzáadod a megfelelő controlokat és eseményeket, property-ket.

    A canvast is inkább beleraknám egy listbox/listview-ba (kicserélném a listbox stackpanel-jét canvas-ra)

    Készítettem egy sample projectet
    Itt láthatod hogy kell készíteni egyedi controlokat.

    https://dl.dropbox.com/u/100423015/CustomControlSample.rar
    Mutasd a teljes hozzászólást!
  • Lehet, hogy nem fogod tudni megnyitni. Most látom, hogy 2010-et használsz.

    Mutasd a teljes hozzászólást!
  • Köszönöm !

    Sajnos a projektet nem tudom letölteni 404.

    Próbálkozom vele. (tákolva már sikerült megoldanom, de most meg akarom úgy csinálni, ahogyan azt kell, hogy későbbi módosításokat is könnyedén tudjak eszközölni).

    Igazából azért csináltam UC-ként, mert így a létrehozáskor megmondom, hogy hány csatlakozási pont kell és milyen színű legyen meg hasonlók és legenerálja magát.



    Köszönöm a segítséget.
    Mutasd a teljes hozzászólást!
  • Kedves ciw!

    Elég illetlen amit most művelsz.
    A nyitó kérdésedre megadtam a jó választ és ezért jogosan érzem úgy, hogy azt elfogadd megoldásként.

    Szombati Peter is megérdemelné, hogy nyiss egy új topikot, ahol egész biztosan továbbra is szívesen segít majd neked.

    D.
    Mutasd a teljes hozzászólást!
  • Milyen igaz!

    Elnézéseteket kérem, csak a magam problémájával bombázlak titeket.



    Itt nyitottam új támát.

    dante köszönöm, adom a pontot.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd