private VideoPanelItem findAVideoPanel(SplitScreenNode node) { VideoPanelItem panel = null; if (_garbageItems.Count > 0) { panel = _garbageItems[_garbageItems.Count - 1]; _garbageItems.RemoveAt(_garbageItems.Count - 1); Console.WriteLine("GetPanel from Garbage!"); } else { panel = new VideoPanelItem(ViewModel.CanItemClose); } panel.ViewModel.CanClose = ViewModel.CanItemClose; if (!string.IsNullOrWhiteSpace(node.VideoId)) { panel.PlayVideo(node.VideoId); } //绑定属性 panel.SetBinding(Grid.RowProperty, CreateBinding(node, BindingMode.TwoWay, nameof(node.Row))); panel.SetBinding(Grid.ColumnProperty, CreateBinding(node, BindingMode.TwoWay, nameof(node.Column))); panel.SetBinding(Grid.RowSpanProperty, CreateBinding(node, BindingMode.TwoWay, nameof(node.RowSpan))); panel.SetBinding(Grid.ColumnSpanProperty, CreateBinding(node, BindingMode.TwoWay, nameof(node.ColumnSpan))); panel.ViewModel.SplitScreenNode = node; SetDragDropParam(panel); //监听鼠标点击事件,以隐藏VideoControl的控制面板。 panel.PreviewMouseDown += Panel_PreviewMouseDown; return(panel); }
private void updateOpacity(VideoPanelItem vpi, double opacity) { if (vpi?.ViewModel?.ControlViewModel != null) { vpi.ViewModel.ControlViewModel.Opacity = opacity; } }
private void BindElementProp(VideoPanelItem vpi) { //按钮绑定。 MultiBinding multi = new MultiBinding(); multi.Mode = BindingMode.OneWay; multi.Converter = new MultiConverter(); multi.Bindings.Add(CreateBinding(vpi, BindingMode.OneWay, "DataContext.ControlViewModel.IsVisible")); multi.Bindings.Add(CreateBinding(vpi, BindingMode.OneWay, "DataContext.ControlViewModel.IsFullScreen")); btnToNormal.SetBinding(VisibilityProperty, multi); Binding binding = CreateBinding(vpi, BindingMode.TwoWay, "DataContext.ControlViewModel.IsFullScreen"); btnToNormal.SetBinding(ToggleButton.IsCheckedProperty, binding); IValueConverter converter = new InnerBoolToVisibility(); //全屏窗绑定 binding = CreateBinding(vpi, BindingMode.OneWay, "DataContext.ControlViewModel.IsFullScreen"); binding.Converter = converter; binding.ConverterParameter = "AND"; gridFull.SetBinding(VisibilityProperty, binding); //弹出窗绑定 binding = CreateBinding(vpi, BindingMode.OneWay, "DataContext.ControlViewModel.IsFullScreen"); binding.Converter = converter; binding.ConverterParameter = "XOR"; canvasPopup.SetBinding(VisibilityProperty, binding); //源父窗体绑定 _parent.SetBinding(VisibilityProperty, binding); }
private bool TryCalcToSize(VideoPanelItem vpi, ref Size toSize) { if (vpi.ActualWidth == 0 || vpi.ActualHeight == 0) { return(false); } double toWidth = Math.Min(AppConstants.VideoControlMinWidth, this.ActualWidth); double toHeight = Math.Min(AppConstants.VideoControlMinHeight, this.ActualHeight); double ratioW = toWidth / vpi.ActualWidth; double ratioH = toHeight / vpi.ActualHeight; double ratio = Math.Max(ratioW, ratioH); if (ratio <= 1) { return(false); } toWidth = vpi.ActualWidth * ratio; toHeight = vpi.ActualHeight * ratio; if (toWidth > this.ActualWidth - AppConstants.VideoControlMargin * 2) { toWidth = this.ActualWidth - AppConstants.VideoControlMargin * 2; } if (toHeight > this.ActualHeight - AppConstants.VideoControlMargin * 2) { toHeight = this.ActualHeight - AppConstants.VideoControlMargin * 2; } toSize = new Size(toWidth, toHeight); return(true); }
public void Dragging(DragInfo info) { VideoPanelItem vpi = info.Source as VideoPanelItem; if (info.Effects == DragDropEffects.None) { if (!IsCursorInWindow(info) && vpi.ViewModel != null && vpi.ViewModel.IsInEditStatus) { Mouse.SetCursor(Cursors.Hand); info.Handled = true; } } else { Mouse.SetCursor(Cursors.SizeAll); info.Handled = true; } if (vpi != null) { if (info.Effects.HasFlag(DragDropEffects.Copy)) { updateOpacity(vpi, 1); } else { updateOpacity(vpi, 0); } } }
private int _delayTime = 300; //延时时间。 public void DragOver(DropInfo info) { _mouseOn = true; if (info.KeyStates.HasFlag(DragDropKeyStates.ControlKey)) { info.Effects = DragDropEffects.Copy; } else { info.Effects = DragDropEffects.Move; } if (!_accepted) { VideoPanelItem vpi = info.Target as VideoPanelItem; VideoPanelItem srcVpi = info.Source as VideoPanelItem; //延时拖动接收。 if (Environment.TickCount - _startTick < _delayTime) { return; } string videoId = info.Data as string; if (videoId == null && info.DataType.ToUpper().EndsWith(".STRING")) { videoId = info.GetDataFromJson <string>(); } if (videoId == null) { info.Effects = DragDropEffects.None; return; } if (vpi != null && videoId != null && !vpi.Equals(srcVpi)) { _videoMode = vpi.ViewModel.ControlViewModel; DropAdorner = CreateAdorner(vpi); DropAdorner.VisualCover.Visibility = Visibility.Hidden; // Point toPnt = new Point(0, 0); double scaleX = 1; double scaleY = 1; if (srcVpi != null && IsBrothers(srcVpi, vpi)) { //隐藏源的视频。 if (vpi.VideoControl != null && vpi.ViewModel.ControlViewModel.IsVisible) { _videoMode.Opacity = 0; DropAdorner.VisualCover.Visibility = Visibility.Visible; toPnt = vpi.PointFromScreen(srcVpi.PointToScreen(new Point(0, 0))); scaleX = srcVpi.ActualWidth / vpi.ActualWidth; scaleY = srcVpi.ActualHeight / vpi.ActualHeight; } } //启动动画。 Storyboard sb = CreateStoryboard(toPnt, scaleX, scaleY, 1); sb.Begin(DropAdorner, true); _accepted = true; } } }
public void StopAll() { for (int i = 0; i < gridMain.Children.Count; i++) { VideoPanelItem item = gridMain.Children[i] as VideoPanelItem; item?.PlayVideo(null); } }
private void setPanelEditStatus(bool editting) { for (int i = 0; i < gridMain.Children.Count; i++) { VideoPanelItem item = gridMain.Children[i] as VideoPanelItem; item.ViewModel.IsInEditStatus = editting; } }
private void RemoveVideoFromInitParent(VideoPanelItem vpi) { _parent = vpi.Parent as Panel; _lastIndex = _parent.Children.IndexOf(vpi); _parent.Children.Remove(vpi); _vpi = vpi; _vpi.SetValue(DragDropTool.AllowDragProperty, false); _parent.Visibility = Visibility.Collapsed; }
public void ClearVideoPanel() { if (_vpi != null) { UnbindElementProp(); AddVideoToInitParent(); _vpi = null; HideCurrent(); } }
public void UpdateSelectedVideos() { List <string> videoIds = ViewModel?.SplitScreenData?.Nodes?.Where(e => !string.IsNullOrWhiteSpace(e.VideoId)).Select(v => v.VideoId).ToList(); for (int i = 0; i < gridMain.Children.Count; i++) { VideoPanelItem item = gridMain.Children[i] as VideoPanelItem; item.ViewModel.UpdateDisplayVideos(videoIds); } }
private void SearchPanel_Visible(object sender, RoutedEventArgs e) { VideoPanelItem vpi = e.Source as VideoPanelItem; if (vpi != null) { if (vpi.ViewModel.SearchedResultModel.IsVisible) { topCover.InsertVideoPanel(vpi, false); } } }
public void InsertVideoPanel(VideoPanelItem vpi, bool isFullScreen) { bool inserted = isFullScreen ? InsertFullScreen(vpi) : InsertPopup(vpi); if (inserted) { _onScaling = false; DisplayCurrent(); _isInitFullScreen = isFullScreen; BindElementProp(vpi); } }
private void VideoControl_FullScreen(object sender, RoutedEventArgs e) { VideoPanelItem vpi = e.Source as VideoPanelItem; if (vpi != null) { VideoControl vc = e.OriginalSource as VideoControl; if (vc.ViewModel.IsFullScreen) { topCover.InsertVideoPanel(vpi, true); } } }
public void DragStart(DragInfo info) { VideoPanelItem vpi = info.Source as VideoPanelItem; if (vpi.VideoControl != null) { Binding binding = new Binding(); binding.Mode = BindingMode.OneWay; binding.Source = vpi.VideoControl.videoDisp; vpi.SetBinding(DragDropVisual.VisualProperty, binding); _topWin = FindTopWindow(vpi); updateOpacity(vpi, 0); } }
private async Task <VideoPanelItem[]> CreateVideoPanels(SplitScreenInfo data) { DateTime timeStart = DateTime.Now; VideoPanelItem[] vpis = new VideoPanelItem[data.Nodes.Length]; for (int i = 0; i < data.Nodes.Length; i++) { var node = data.Nodes[i]; VideoPanelItem panel = findAVideoPanel(node); vpis[i] = panel; await Task.Delay(10); } Console.WriteLine("Load Count:{0} UsedTime:{1}", gridMain.Children.Count, DateTime.Now - timeStart); return(vpis); }
private void VideoControl_PanelVisible(object sender, RoutedEventArgs e) { VideoPanelItem vpi = e.Source as VideoPanelItem; if (vpi != null) { VideoControl vc = e.OriginalSource as VideoControl; if (vc.ViewModel.IsControlPanelVisible && !vc.ViewModel.IsFullScreen) { topCover.InsertVideoPanel(vpi, false); } //else if (string.IsNullOrWhiteSpace(vc.ViewModel.VideoId) && !vc.ViewModel.IsFullScreen) // topCover.ClearVideoPanel(); } }
VideoPanelItem getFirstBlankItem() { List <ItemSequence> list = new List <ItemSequence>(); for (int i = 0; i < gridMain.Children.Count; i++) { VideoPanelItem item = gridMain.Children[i] as VideoPanelItem; int split = ViewModel.SplitScreenData.Split; if (item != null && !item.IsPlaying) { int row = (int)item.GetValue(Grid.RowProperty); int col = (int)item.GetValue(Grid.ColumnProperty); list.Add(new ItemSequence(item, row * split + col)); } } list = list.OrderBy(e => e.SerialNumber).ToList(); return(list.FirstOrDefault()?.PanelItem); }
public void Drop(DropInfo info) { _mouseOn = false; _accepted = false; ResetAdorner(); if (_videoMode != null) { _videoMode.Opacity = 1; _videoMode = null; } string videoId = info.Data as string; if (videoId == null) { videoId = info.GetDataFromJson <string>(); } if (videoId != null) { VideoPanelItem vpi = info.Target as VideoPanelItem; if (vpi != null) { VideoPanelItem srcVpi = info.Source as VideoPanelItem; if (srcVpi != null && !srcVpi.Equals(vpi) && !info.KeyStates.HasFlag(DragDropKeyStates.ControlKey)) { //没有交换则直接设置ID。 if (!Exchange(srcVpi, vpi)) { vpi.PlayVideo(videoId); info.Effects = DragDropEffects.Copy; } else { info.Effects = DragDropEffects.Move; } } else { vpi.PlayVideo(videoId); info.Effects = DragDropEffects.Move; } } } }
private bool ShowVideoWin(DragInfo info, VideoPanelItem vpi) { if (_topWin != null) { string videoID = (string)info.Data; PopupWinModel model = new PopupWinModel(videoID); PopupWin popup = new PopupWin(); popup.IsTopmost = true; popup.DataContext = model; Point startPos = info.GetPosition(vpi); startPos = vpi.PointToScreen(startPos); startPos = new Point(startPos.X - vpi.ActualWidth / 2, startPos.Y - vpi.ActualHeight / 2); if (startPos.X < 0) { startPos.X = 0; } if (startPos.Y < 0) { startPos.Y = 0; } popup.Left = startPos.X; popup.Top = startPos.Y; if (vpi.ActualWidth < AppConstants.VideoControlMinWidth) { popup.Width = AppConstants.VideoControlMinWidth; if (vpi.ActualHeight == 0) { popup.Height = AppConstants.VideoControlMinWidth * 0.75; } else { popup.Height = vpi.ActualHeight * (AppConstants.VideoControlMinWidth / vpi.ActualWidth); } } else { popup.Width = vpi.ActualWidth; popup.Height = vpi.ActualHeight; } popup.Show(); return(true); } return(false); }
//设置视频窗口的可拖拽属性。 private void SetDragDropParam(VideoPanelItem vpi) { vpi.SetValue(DragDropTool.AllowDropProperty, true); vpi.SetValue(DragDropTool.DropHandlerProperty, new VideoPanelDropHandler()); vpi.SetValue(DragDropTool.DragHandlerProperty, new VideoPanelDragHandler()); //允许拖动 Binding binding = CreateBinding(vpi.DataContext, BindingMode.OneWay, "ControlViewModel.IsVisible"); vpi.SetBinding(DragDropTool.AllowDragProperty, binding); //设置拖动数据 binding = CreateBinding(vpi.DataContext, BindingMode.OneWay, "ControlViewModel.VideoId"); vpi.SetBinding(DragDropData.DataProperty, binding); //设置可视化 vpi.SetValue(DragDropVisual.ShadowVisibleProperty, true); vpi.SetValue(DragDropVisual.ShadowColorProperty, Color.FromRgb(0, 255, 0)); vpi.SetValue(DragDropVisual.BorderThicknessProperty, new Thickness(2)); }
private void Panel_PreviewMouseDown(object sender, MouseButtonEventArgs e) { if (ViewModel.OnSwitching && !ViewModel.SwitchPaused) { ViewModel.SwitchPaused = true; e.Handled = true; return; } VideoPanelItem item = sender as VideoPanelItem; foreach (VideoPanelItem vpi in gridMain.Children) { if (!item.Equals(vpi)) { vpi.ViewModel.ControlViewModel.IsControlPanelVisible = false; vpi.ViewModel.SearchedResultModel.IsVisible = false; vpi.ViewModel.PlusSignModel.IsVisible = true; } } }
public void DragEnd(DragInfo info) { VideoPanelItem vpi = info.Source as VideoPanelItem; if (info.Effects == DragDropEffects.None) { //当鼠标移出窗体且没有接收源时,打开一个新视频窗口,同时关闭源视频。 if (!IsCursorInWindow(info) && vpi.ViewModel != null && vpi.ViewModel.IsInEditStatus) { if (ShowVideoWin(info, vpi)) { if (vpi.ViewModel != null && vpi.ViewModel.ControlViewModel != null) { vpi.ViewModel.ControlViewModel.VideoId = null; } } } } _topWin = null; updateOpacity(vpi, 1); }
private bool InsertPopup(VideoPanelItem vpi) { Size toSize = default(Size); if (!TryCalcToSize(vpi, ref toSize)) { return(false); } Point fromPos = vpi.TranslatePoint(new Point(), this); Point toPos = CalcToLocation(toSize); RemoveVideoFromInitParent(vpi); RecordVideoPreLocation(vpi, fromPos); gridMain.Children.Add(vpi); //动画 Storyboard sb = CreateStoryboard(vpi.ActualWidth, toSize.Width, vpi.ActualHeight, toSize.Height, fromPos, toPos); sb.Begin(gridMain); return(true); }
VideoPanelDropAdorner CreateAdorner(VideoPanelItem vpi) { VideoPanelDropAdorner adorner = new VideoPanelDropAdorner(vpi, vpi.VideoControl?.videoDisp); return(adorner); }
private void RecordVideoPreLocation(VideoPanelItem vpi, Point fromPos) { //记录初始值。 _initSize = new Size(vpi.ActualWidth, vpi.ActualHeight); _initPos = fromPos; }
private bool InsertFullScreen(VideoPanelItem vpi) { RemoveVideoFromInitParent(vpi); gridFull.Children.Add(vpi); return(true); }
public ItemSequence(VideoPanelItem item, int number) { PanelItem = item; SerialNumber = number; }
private void destoryVideoPanel(VideoPanelItem vpi) { vpi.PreviewMouseDown -= Panel_PreviewMouseDown; vpi.ViewModel.SplitScreenNode = null; vpi.PlayVideo(null); }