using System; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Media3D; using XCommon.Log; using XImagingXhandler.XDAL; namespace XHandler.View.Device { /// /// 设备状态共用页面 /// public partial class DeviceStatusCom : UserControl { #region 设备参数信息 public class DeviceStatusInfo { /// /// 设备ID /// public string DeviceId { get; set; } /// /// 设备连接状态 /// public bool Status { get; set; } /// /// 设备连接状态文言 /// public string StatusTitle { get; set; } /// /// 鼠标提示文言 /// public string ToolTip { get; set; } /// /// DeviceLeft(X) /// public double DeviceLeft { get; set; } /// /// DeviceTop(Y) /// public double DeviceTop { get; set; } } #endregion #region 变量 private Element m_current = new Element(); /// /// 设备参数信息 /// private DeviceStatusInfo m_statusInfo = null; public event EventHandler MouseUp; #endregion #region 构造函数 /// /// 构造函数 /// /// /// /// public DeviceStatusCom(DeviceStatusInfo statusInfo) { InitializeComponent(); m_statusInfo = statusInfo; } #endregion #region 界面初期表示事件 private void UserControl_Loaded(object sender, RoutedEventArgs e) { try { // 提示文言 canvas.ToolTip = m_statusInfo.ToolTip; // 状态图片 btnStatus.NormalImage = (ImageSource)new ImageSourceConverter().ConvertFrom(new Uri(m_statusInfo.Status ? "pack://application:,,,./Assets/RunStatus/GreenState.jpg" : "pack://application:,,,./Assets/RunStatus/GreyState.jpg")); // 状态文言 tBlockStatusTitle.Text = m_statusInfo.StatusTitle; #region 设置位置 var transformGroup = ((UIElement)border).RenderTransform as TransformGroup; if (transformGroup != null) { var translateTransforms = from transform in transformGroup.Children where transform.GetType().Name == "TranslateTransform" select transform; foreach (TranslateTransform tt in translateTransforms) { tt.X = m_statusInfo.DeviceLeft; tt.Y = m_statusInfo.DeviceTop; } } #endregion } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } } #endregion #region 拖拽相关 protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { //LoggerHelper.DebugLog("=============== OnMouseLeftButtonDown"); base.OnMouseLeftButtonDown(e); this.m_current.X = Mouse.GetPosition(this.canvas).X; this.m_current.Y = Mouse.GetPosition(this.canvas).Y; if (this.m_current.InputElement != null) { this.m_current.InputElement.CaptureMouse(); } if (!this.m_current.IsStretching) { this.m_current.IsDragging = true; } } protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) { //LoggerHelper.DebugLog("=============== OnMouseLeftButtonUp"); base.OnMouseLeftButtonUp(e); if (this.m_current.InputElement != null) { this.m_current.InputElement.ReleaseMouseCapture(); } var newX = Mouse.GetPosition((IInputElement)canvas).X; var newY = Mouse.GetPosition((IInputElement)canvas).Y; LoggerHelper.DebugLog(string.Format("=============== [OnMouseLeftButtonUp]:newX = {0}, newY = {1}", newX, newY)); #region 获取拖动坐标 var transformGroup = ((UIElement)border).RenderTransform as TransformGroup; if (transformGroup != null) { var translateTransforms = from transform in transformGroup.Children where transform.GetType().Name == "TranslateTransform" select transform; var ttFirst = translateTransforms.FirstOrDefault(); if (ttFirst != null) { TranslateTransform tt = (TranslateTransform)ttFirst; m_statusInfo.DeviceLeft = tt.X; m_statusInfo.DeviceTop = tt.Y; MouseUp?.Invoke(m_statusInfo, EventArgs.Empty); } } #endregion this.Cursor = Cursors.Arrow; } private void Canvas_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed && m_current.InputElement != null) { //LoggerHelper.DebugLog("=============== Canvas_MouseMove 1"); //递增z-Order并将其传递给当前元素,以使其停留在所有其他元素的顶部 ((Border)this.m_current.InputElement).SetValue(Canvas.ZIndexProperty, this.m_current.ZIndex++); //判断操作类型为拖拽移动 if (this.m_current.IsDragging) { Drag(sender); } } } private void border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { //LoggerHelper.DebugLog("=============== border_MouseLeftButtonDown"); //capture the last highest z index before pointing to new current element //在指向新的当前元素之前捕获最后的最高z索引 int newZIndex = (int)((Border)sender).GetValue(Canvas.ZIndexProperty); this.m_current.ZIndex = newZIndex > this.m_current.ZIndex ? newZIndex : this.m_current.ZIndex; //capture the new current element //捕获新的当前元素 this.m_current.InputElement = (IInputElement)sender; } private void border_MouseLeave(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { return; } //LoggerHelper.DebugLog("=============== border_MouseLeave"); // 获得坐标、计算Border Border border = (Border)sender; var rightLimit = border.ActualWidth - border.Padding.Right; var bottomLimit = border.ActualHeight - border.Padding.Bottom; //获得鼠标点击(与特定元素的相对位置) var x = Mouse.GetPosition((IInputElement)sender).X; var y = Mouse.GetPosition((IInputElement)sender).Y; // figure out stretching directions - only to Right, Bottom //找出缩放的方向-仅向右方、底部 bool stretchRight = (x >= rightLimit && x < border.ActualWidth) ? true : false; bool stretchBottom = (y >= bottomLimit && y < border.ActualHeight) ? true : false; // update current element //更新当前元素 this.m_current.InputElement = (IInputElement)sender; this.m_current.X = x; this.m_current.Y = y; //默认为“缩放”操作 this.m_current.IsStretching = true; //set cursor to show stretch direction //设置光标显示 //右&底部,光标显示右下箭头 if (stretchRight && stretchBottom) { this.Cursor = Cursors.SizeNWSE; return; } //右 else if (stretchRight && !stretchBottom) { this.Cursor = Cursors.SizeWE; return; } //底部 else if (stretchBottom && !stretchRight) { this.Cursor = Cursors.SizeNS; return; } //非缩放操作,显示箭头光标,设置IsStretching=false else //no stretch { this.Cursor = Cursors.Arrow; this.m_current.IsStretching = false; } } private void border_MouseEnter(object sender, MouseEventArgs e) { //LoggerHelper.DebugLog("=============== border_MouseEnter 2"); Border border = (Border)sender; var rightLimit = border.ActualWidth - border.Padding.Right; var bottomLimit = border.ActualHeight - border.Padding.Bottom; var x = Mouse.GetPosition((IInputElement)sender).X; var y = Mouse.GetPosition((IInputElement)sender).Y; if (x < rightLimit && y < bottomLimit) this.Cursor = Cursors.Arrow; } /// /// 拖拽移动 /// /// private void Drag(object sender) { //LoggerHelper.DebugLog("=============== border_MouseEnter"); this.Cursor = Cursors.Hand; // Retrieve the current position of the mouse. var newX = Mouse.GetPosition((IInputElement)sender).X; var newY = Mouse.GetPosition((IInputElement)sender).Y; // Reset the location of the object (add to sender's renderTransform newPosition minus currentElement's position var transformGroup = ((UIElement)this.m_current.InputElement).RenderTransform as TransformGroup; if (transformGroup == null) { return; } var translateTransforms = from transform in transformGroup.Children where transform.GetType().Name == "TranslateTransform" select transform; foreach (TranslateTransform tt in translateTransforms) { tt.X += newX - m_current.X; tt.Y += newY - m_current.Y; LoggerHelper.DebugLog(string.Format("===============!!!!! [Drag]:tt.X = {0}, tt.Y = {1}", tt.X, tt.Y)); } // Update the beginning position of the mouse m_current.X = newX; m_current.Y = newY; LoggerHelper.DebugLog(string.Format("=============== [Drag]:newX = {0}, newY = {1}", newX, newY)); } #endregion } }