/// <summary> /// Обновляет множество выделенных элементов на рабочем холсте /// </summary> private void UpdateSelection() { Rect selectionRect = new Rect(SelectionStartPoint.Value, SelectionEndPoint.Value); foreach (UIElement element in Canvas.Children) { if (!(element is StoryboardItem)) { continue; } StoryboardItem storyboardItem = (StoryboardItem)element; Rect itemRect = VisualTreeHelper.GetDescendantBounds(storyboardItem); Rect itemBounds = storyboardItem.TransformToAncestor(Canvas).TransformBounds(itemRect); if (selectionRect.Contains(itemBounds)) { storyboardItem.IsSelected = true; } else { storyboardItem.IsSelected = false; } } }
/// <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="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="eventArgs"></param> protected override void OnDrop(DragEventArgs eventArgs) { base.OnDrop(eventArgs); string xamlString; Point position = eventArgs.GetPosition(this); if ((xamlString = eventArgs.Data.GetData("STORYBOARD_ITEM") as string) != null) { FrameworkElement content = XamlReader.Load(XmlReader.Create(new StringReader(xamlString))) as FrameworkElement; if (content != null) { StoryboardItem newItem = new StoryboardItem(); newItem.Content = content; if (content.MinHeight != 0 && content.MinWidth != 0) { newItem.Width = content.MinWidth * 2;; newItem.Height = content.MinHeight * 2; } else { newItem.Width = 65; newItem.Height = 65; } SetLeft(newItem, Math.Max(0, position.X - newItem.Width / 2)); SetTop(newItem, Math.Max(0, position.Y - newItem.Height / 2)); Children.Add(newItem); DeselectAll(); newItem.IsSelected = true; } eventArgs.Handled = true; } else if ((xamlString = eventArgs.Data.GetData("STORYBOARD_BACKGROUND") as string) != null) { Image content = XamlReader.Load(XmlReader.Create(new StringReader(xamlString))) as Image; if (content != null && BackgroundManager != null) { BackgroundManager.AddImageAt(position, content.Source); } } }
/// <summary> /// Удаляет выделенные на данный момент элементы раскадровки /// </summary> public void DeleteSelectedItems() { for (int i = 0; i < Children.Count; i++) { StoryboardItem item = Children[i] as StoryboardItem; if (item != null) { if (item.IsSelected) { Children.RemoveAt(i--); } } } }
/// <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="item">Элемент раскадровки, который предполагается переместить на передний план</param> public void BringToFront(StoryboardItem item) { SetZIndex(item, ++MaximumZIndex); }