2009-12-25 15 views
1

Je suis en train d'écrire une classe de groupe à partir de ces deux ressources:WPF Panel Draggable classe

La classe du panneau aura deux propriétés attachées "X" et "Y" et si un élément donne x et y à zéro alors il sera placé au centre du panneau. Le panneau permettra également à l'utilisateur de faire glisser les choses. S'il vous plaît, aidez-moi à écrire cette classe. Je suis très nouveau à WPF.


C'est ainsi que je suis arrivé. Maintenant j'ai essayé d'implémenter ceci mais cela ne fonctionne pas, si vous pouvez m'aider à implémenter les fonctions GetTop, GetLeft, GetBottom, GetRight qui ne sont pas définies par défaut dans la classe panel et qui sont nécessaires. Si ces 4 méthodes sont présentes, les fonctions de glissement peuvent être implémentées ici.

using System; 
using System.Linq; 
using System.Windows; 
using System.ComponentModel; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace SmartERP.Elements 
{ 
    public class SmartCanvas : Panel 
    { 
     public static readonly DependencyProperty TopProperty; 
     public static readonly DependencyProperty LeftProperty; 
     public static readonly DependencyProperty BottomProperty; 
     public static readonly DependencyProperty RightProperty; 

     static SmartCanvas() 
     { 
      TopProperty = DependencyProperty.Register("Top", typeof(double), typeof(SmartCanvas), new PropertyMetadata(0.0)); 
      LeftProperty = DependencyProperty.Register("Left", typeof(double), typeof(SmartCanvas), new PropertyMetadata(0.0)); 
      BottomProperty = DependencyProperty.Register("Bottom", typeof(double), typeof(SmartCanvas), new PropertyMetadata(0.0)); 
      RightProperty = DependencyProperty.Register("Right", typeof(double), typeof(SmartCanvas), new PropertyMetadata(0.0)); 
     } 

     public double Top 
     { 
      get { return (double)base.GetValue(TopProperty); } 
      set { base.SetValue(TopProperty, value); } 
     } 

     public double Bottom 
     { 
      get { return (double)base.GetValue(BottomProperty); } 
      set { base.SetValue(BottomProperty, value); } 
     } 

     public double Left 
     { 
      get { return (double)base.GetValue(LeftProperty); } 
      set { base.SetValue(LeftProperty, value); } 
     } 

     public double Right 
     { 
      get { return (double)base.GetValue(RightProperty); } 
      set { base.SetValue(RightProperty, value); } 
     } 

     private double GetTop(UIElement element) 
     { 
      return (double)this.GetValue(TopProperty); 
     } 

     private double GetLeft(UIElement element) 
     { 
      return (double)this.GetValue(LeftProperty); 
     } 

     private double GetBottom(UIElement element) 
     { 
      return (double)this.GetValue(BottomProperty); 
     } 

     private double GetRight(UIElement element) 
     { 
      return (double)this.GetValue(RightProperty); 
     } 

     protected override Size ArrangeOverride(Size arrangeSize) 
     { 
      Point middle = new Point(arrangeSize.Width/2, arrangeSize.Height/2); 

      foreach (UIElement element in base.InternalChildren) 
      { 
       if (element == null) 
       { 
        continue; 
       } 
       double x = 0.0; 
       double y = 0.0; 
       double left = GetLeft(element); 
       if (!double.IsNaN(left)) 
       { 
        x = left; 
       } 

       double top = GetTop(element); 
       if (!double.IsNaN(top)) 
       { 
        y = top; 
       } 

       element.Arrange(new Rect(new Point(middle.X + x, middle.Y + y), element.DesiredSize)); 
      } 
      return arrangeSize; 
     } 
    } 
} 
+0

Qu'est-ce que vous avez jusqu'ici et où êtes-vous exactement coincé? – Heinzi

+0

Comment puis-je l'implémenter? S'il vous plaît aider. –

+0

Soham, vous n'avez pas expliqué ce que vous essayez de mettre en œuvre. Comment pouvons-nous répondre à une question quand nous ne savons pas quelle est la question? Qu'est-ce que vous essayez d'accomplir? Qu'est-ce que votre code fait ou ne fait pas actuellement? Comment s'écarte-t-il du comportement attendu? Comment votre panneau personnalisé est-il utilisé (avec un exemple de code)? Expliquez ces choses et quelqu'un ici peut probablement vous orienter dans la bonne direction. –

Répondre

1

La classe du panneau aura deux propriétés attachées "X" et "Y" [...]

OK, alors vous devriez mettre en œuvre ces propriétés attachées. Voir l'exemple de la section Propriétés jointes personnalisées du Attached Properties Overview sur MSDN. Voici comment cela rechercherait X:

public static readonly DependencyProperty XProperty = 
    DependencyProperty.RegisterAttached("X", typeof(double), 
     typeof(SmartCanvas), new FrameworkPropertyMetadata(0.0)); 

public static void SetX(UIElement element, double value) { element.SetValue(XProperty, value); } 
public static double GetX(UIElement element) { return (double)element.GetValue(XProperty); } 

Une fois que vous avez fait cela, vous avez GetX et GetY, ce qui est probablement ce que vous entendez par GetTop et GetLeft.

+0

Maintenant, s'il vous plaît, j'utilise le RegisterAttached mais je ne suis toujours pas capable de faire glisser les choses autour de la toile et de ne pas placer le centre d'un élément sur le centre de la toile. S'il vous plaît aider et si vous pouvez suggérer de meilleures façons de placer les choses sur le centre de la toile par des propriétés ci-jointes, s'il vous plaît dites-moi comment l'implémenter. S'il vous plaît aider. –

+0

Pourquoi devriez-vous être capable de glisser et déposer des choses --- votre code ne contient rien de lié à glisser-déposer! Peut-être une courte clarification est dans l'ordre: Les gens ici vous aideront volontiers (a) trouver des bugs dans votre code, (b) vous mettre sur la bonne voie pour résoudre un problème et (c) vous aider à comprendre les concepts WPF. Ce que vous n'obtiendrez probablement pas, c'est: "J'ai besoin d'un programme qui fait X, s'il vous plaît écrivez-le pour moi." – Heinzi

+0

OK, pour revenir à votre problème: Pourquoi utilisez-vous un Panel au lieu d'un Canvas comme classe de base? L'exemple de glisser lié à votre question nécessite les propriétés attachées Left, Top, etc. de 'Canvas', qui ont probablement du code attaché (vous ne pouvez donc pas créer le même effet en utilisant un Panel et en recréant les propriétés attachées) . – Heinzi