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
}
}