예제 #1
0
파일: DragThumb.cs 프로젝트: isgulkov/issb
        /// <summary>
        /// Инициирует операцию перемещения путем запоминания в данном объекте элемента, который пользователь начал перетаскивать, и рабочего холста, на котором происходит операция перемещения
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        private void DragThumb_DragStarted(object sender, DragStartedEventArgs eventArgs)
        {
            CurrentItem = DataContext as StoryboardItem;

            if (CurrentItem != null)
            {
                CurrentCanvas = VisualTreeHelper.GetParent(CurrentItem) as StoryboardCanvas;
            }
        }
예제 #2
0
        /// <summary>
        /// Обрабатывает двойной щелчок мыши по данном элементу, перемещая его на холсте на передний план
        /// </summary>
        /// <param name="eventArgs"></param>
        protected override void OnMouseDoubleClick(MouseButtonEventArgs eventArgs)
        {
            base.OnMouseDoubleClick(eventArgs);

            StoryboardCanvas canvas = VisualTreeHelper.GetParent(this) as StoryboardCanvas;

            if (canvas != null)
            {
                canvas.BringToFront(this);
            }
        }
예제 #3
0
        /// <summary>
        /// Загружает документ-раскадровку с рабочего холста программы
        /// </summary>
        /// <param name="storyboardCanvas">Рабочий холст программы, с которой предполагается загрузить документ-раскадровку</param>
        /// <returns></returns>
        public static StoryboardDocument LoadFromCanvas(StoryboardCanvas storyboardCanvas)
        {
            StoryboardDocument newDocument = new StoryboardDocument();

            newDocument.Template = storyboardCanvas.BackgroundManager.CurrentTempalte;

            List <ImageSource> frameBackgrounds = new List <ImageSource>();

            for (int i = 0; i < storyboardCanvas.BackgroundManager.CurrentTempalte.NumFrames; i++)
            {
                frameBackgrounds.Add(storyboardCanvas.BackgroundManager.GetImageOfFrame(i));
            }

            newDocument.FrameBackgrounds = frameBackgrounds;

            List <ItemTuple> storyboardItems = new List <ItemTuple>();

            UIElement[] storyboardCanvasChildren = new UIElement[storyboardCanvas.Children.Count];

            storyboardCanvas.Children.CopyTo(storyboardCanvasChildren, 0);

            foreach (UIElement element in storyboardCanvasChildren.OrderBy(x => Panel.GetZIndex(x)))
            {
                StoryboardItem item = element as StoryboardItem;

                if (item != null)
                {
                    RotateTransform itemTransform = item.RenderTransform as RotateTransform;

                    item.RenderTransform = null;

                    Rect itemRect = new Rect();

                    itemRect.X      = Canvas.GetLeft(item);
                    itemRect.Y      = Canvas.GetTop(item);
                    itemRect.Width  = item.ActualWidth;
                    itemRect.Height = item.ActualHeight;

                    item.RenderTransform = itemTransform;

                    Image itemImageSource = (Image)item.Content;

                    ItemTuple newTuple = new ItemTuple(itemRect, itemTransform, itemImageSource.Source);

                    storyboardItems.Add(newTuple);
                }
            }

            newDocument.StoryboardItems = storyboardItems;

            return(newDocument);
        }
예제 #4
0
        /// <summary>
        /// Конструктор. Объект данного типа предполагается создавать всякий раз, когда пользователь начинает операцию множественного выделения (путем перетаскивания указателя мыши по холсту с зажатой левой кнопкой)
        /// </summary>
        /// <param name="canvas">Холст, на который предполагается добавить данный визуальный декоратор</param>
        /// <param name="dragStartPoint">Начальная точка зоны выделения</param>
        public MultipleSelectionAdorner(StoryboardCanvas canvas, Point?dragStartPoint) : base(canvas)
        {
            Canvas = canvas;
            SelectionStartPoint = dragStartPoint;

            AdornerCanvas            = new Canvas();
            AdornerCanvas.Background = Brushes.Transparent;
            Visuals = new VisualCollection(this);
            Visuals.Add(AdornerCanvas);

            SelectionRect                 = new Rectangle();
            SelectionRect.Stroke          = Brushes.DarkGreen;
            SelectionRect.StrokeThickness = 1;
            SelectionRect.StrokeDashArray = new DoubleCollection(new double[] { 4 });

            AdornerCanvas.Children.Add(SelectionRect);
        }
예제 #5
0
        /// <summary>
        /// Инициализирует фон на переданном рабочем холсте (отрисоывает прямоугольники, означающие границы кадров и создает соответствующие кадрам объекты типа Image)
        /// </summary>
        /// <param name="canvas">Холст, на котором предполагается инициализовать фон</param>
        public void InitializeCanvas(StoryboardCanvas canvas)
        {
            canvas.BackgroundManager = this;

            canvas.Width  = CurrentTempalte.CanvasWidth;
            canvas.Height = CurrentTempalte.CanvasHeight;

            FrameBackgrounds = Enumerable.Repeat <Image>(null, CurrentTempalte.NumFrames).ToList();

            DrawingVisual drawingVisual = new DrawingVisual();

            using (DrawingContext drawingContext = drawingVisual.RenderOpen()) {
                for (int i = 0; i < CurrentTempalte.NumFrames; i++)
                {
                    Rectangle newRectangle = new Rectangle();

                    newRectangle.Stroke          = Brushes.Black;
                    newRectangle.StrokeThickness = 1;

                    Rect frameRect = CurrentTempalte.FrameRects.ElementAt(i);

                    Image newImage = new Image();

                    foreach (FrameworkElement element in new FrameworkElement[] { newRectangle, newImage })
                    {
                        element.Width  = frameRect.Width;
                        element.Height = frameRect.Height;

                        Canvas.SetLeft(element, frameRect.X);
                        Canvas.SetTop(element, frameRect.Y);

                        Panel.SetZIndex(element, int.MinValue);

                        element.IsHitTestVisible = false;

                        canvas.Children.Add(element);
                    }

                    newImage.Stretch = Stretch.UniformToFill;

                    FrameBackgrounds[i] = newImage;
                }
            }
        }
예제 #6
0
        /// <summary>
        /// Выгружает данный документ-раскадровку на рабочий холст программы
        /// </summary>
        /// <param name="storyboardCanvas">Рабочий холст программы, на который предполагается выгрузить данный документ-раскадроку</param>
        public void UnloadOntoCanvas(StoryboardCanvas storyboardCanvas)
        {
            storyboardCanvas.Children.Clear();

            BackgroundManager backgoundManager = new BackgroundManager(Template);

            backgoundManager.InitializeCanvas(storyboardCanvas);

            for (int i = 0; i < Template.NumFrames; i++)
            {
                if (FrameBackgrounds[i] != null)
                {
                    backgoundManager.AddImageToFrame(i, FrameBackgrounds[i]);
                }
            }

            foreach (ItemTuple itemTuple in StoryboardItems)
            {
                Image newImage = new Image();

                newImage.Source           = itemTuple.Item3;
                newImage.IsHitTestVisible = false;

                StoryboardItem newItem = new StoryboardItem();

                newItem.Content = newImage;

                Rect itemRect = itemTuple.Item1;

                newItem.Width  = itemRect.Width;
                newItem.Height = itemRect.Height;

                Canvas.SetLeft(newItem, itemRect.X);
                Canvas.SetTop(newItem, itemRect.Y);

                newItem.RenderTransform = itemTuple.Item2;

                storyboardCanvas.Children.Add(newItem);
            }
        }
예제 #7
0
        /// <summary>
        /// Обрабатывает событие нажатия мыши на данном элементе раскадровки с целью поддержки множественного выделения элементов раскадровки
        /// </summary>
        /// <param name="eventArgs"></param>
        protected override void OnPreviewMouseDown(MouseButtonEventArgs eventArgs)
        {
            base.OnPreviewMouseDown(eventArgs);
            StoryboardCanvas canvas = VisualTreeHelper.GetParent(this) as StoryboardCanvas;

            if (canvas != null)
            {
                if ((Keyboard.Modifiers & (ModifierKeys.Shift | ModifierKeys.Control)) != ModifierKeys.None)
                {
                    IsSelected = !IsSelected;
                }
                else
                {
                    if (!IsSelected)
                    {
                        canvas.DeselectAll();
                        IsSelected = true;
                    }
                }
            }

            eventArgs.Handled = false;
        }