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