WPF Dragable Panel Class - PullRequest
       31

WPF Dragable Panel Class

1 голос
/ 25 декабря 2009

Я пытаюсь написать класс панели из этих двух ресурсов:

Класс панели будет иметь два прикрепленных свойства "X" и "Y", и если какой-либо элемент примет значения x и y равными нулю, он будет размещен в центре панели. Панель также позволит пользователю перетаскивать вещи. Пожалуйста, помогите мне написать этот класс. Я очень новичок в WPF.


Вот как далеко я зашёл. Теперь я попытался реализовать это, но это не работает, если вы можете помочь мне реализовать функции GetTop, GetLeft, GetBottom, GetRight, которые по умолчанию не определены в классе панели и которые необходимы. Если эти 4 метода присутствуют, функции перетаскивания могут быть реализованы здесь.

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;
        }
    }
}

1 Ответ

1 голос
/ 28 декабря 2009

Класс панели будет иметь два прикрепленных свойства "X" и "Y" [...]

ОК, тогда вы должны реализовать эти прикрепленные свойства. См. Пример в разделе Настраиваемые пользовательские свойства Обзор вложенных свойств в MSDN. Вот как это будет выглядеть 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); }

Как только вы это сделаете, у вас есть GetX и GetY, что, вероятно, вы подразумеваете под GetTop и GetLeft.

...