Files
MetroGauges-Old/MetroGauges/Utily.cs
2026-02-23 17:02:55 +08:00

318 lines
11 KiB
C#
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace MetroGauges
{
public class Utily
{
/// <summary> 
/// 获取中心点坐标 
/// </summary> 
/// <param name="p"></param> 
/// <returns></returns> 
public static Point GetCenterPoint(Point[] p)
{
Point ptCenter = new Point(0, 0);
int i, j;
double ai, atmp = 0, xtmp = 0, ytmp = 0;
if (p == null)
throw new ArgumentNullException("获取多边形中心点坐标时传入的参数为空。");
if (p.Length == 1)
return p[0];
if ((p.Length == 2) || (p.Length == 3 && p[0] == p[2]))
return new Point((p[1].X + p[0].X) / 2, (p[1].Y + p[0].Y) / 2);
int n = p.Length;
for (i = n - 1, j = 0; j < n; i = j, j++)
{
ai = p[i].X * p[j].Y - p[j].X * p[i].Y;
atmp += ai;
xtmp += (p[j].X + p[i].X) * ai;
ytmp += (p[j].Y + p[i].Y) * ai;
}
if (atmp != 0)
{
ptCenter.X = Convert.ToInt32(xtmp / (3 * atmp));
ptCenter.Y = Convert.ToInt32(ytmp / (3 * atmp));
}
return ptCenter;
}
public static bool isInputNumber(KeyEventArgs e)
{
if (e.Key == Key.OemMinus)
{
return true;
}
if ((e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) ||
e.Key == Key.Delete || e.Key == Key.Back || e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.OemPeriod)
{
//按下了Alt、ctrl、shift等修饰键
if (e.KeyboardDevice.Modifiers != ModifierKeys.None)
{
e.Handled = true;
}
else
{
return true;
}
}
else//按下了字符等其它功能键
{
e.Handled = true;
}
return false;
}
/// <summary>
/// 向上查找控件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
{
while (source != null && source.GetType() != typeof(T))
source = VisualTreeHelper.GetParent(source);
return source;
}
/// <summary>
/// 向下查找控件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tarElem"></param>
/// <returns></returns>
public static T SearchVisualTree<T>(DependencyObject tarElem) where T : DependencyObject
{
var count = VisualTreeHelper.GetChildrenCount(tarElem);
if (count == 0)
return null;
for (int i = 0; i < count; ++i)
{
var child = VisualTreeHelper.GetChild(tarElem, i);
if (child != null && child is T)
{
return (T)child;
}
else
{
var res = SearchVisualTree<T>(child);
if (res != null)
{
return res;
}
}
}
return null;
}
public static TreeViewItem GetNearestContainer(UIElement element)
{
TreeViewItem container = element as TreeViewItem;
while ((container == null) && (element != null))
{
element = VisualTreeHelper.GetParent(element) as UIElement;
container = element as TreeViewItem;
}
return container;
}
/// <summary>
/// 根据邦定类型查找 TreeViewItem
/// </summary>
/// <param name="item"></param>
/// <param name="data"></param>
/// <returns></returns>
public static TreeViewItem FindTreeViewItem(ItemsControl item, object data)
{
TreeViewItem findItem = null;
bool itemIsExpand = false;
if (item is TreeViewItem)
{
TreeViewItem tviCurrent = item as TreeViewItem;
itemIsExpand = tviCurrent.IsExpanded;
if (!tviCurrent.IsExpanded)
{
//如果这个TreeViewItem未展开过则不能通过ItemContainerGenerator来获得TreeViewItem
tviCurrent.SetValue(TreeViewItem.IsExpandedProperty, true);
//必须使用UpdaeLayour才能获取到TreeViewItem
tviCurrent.UpdateLayout();
}
}
for (int i = 0; i < item.Items.Count; i++)
{
TreeViewItem tvItem = (TreeViewItem)item.ItemContainerGenerator.ContainerFromIndex(i);
if (tvItem == null)
continue;
object itemData = item.Items[i];
if (itemData == data)
{
findItem = tvItem;
break;
}
else if (tvItem.Items.Count > 0)
{
findItem = FindTreeViewItem(tvItem, data);
if (findItem != null)
break;
}
}
if (findItem == null)
{
TreeViewItem tviCurrent = item as TreeViewItem;
if (tviCurrent != null)
{
tviCurrent.SetValue(TreeViewItem.IsExpandedProperty, itemIsExpand);
tviCurrent.UpdateLayout();
}
}
return findItem;
}
/// <summary>
/// 使用反射 动态创建类将DataTable的列名动态添加为该类的属性并给属性赋值
/// 该方法由于要动态创建类性能比较低注意只是将DataTable的第一行转换为动态实体类
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static Object CreatNewClassBydt(string classname, ObservableCollection<MetroGauges.Database.Enitys.FieldInfo> fieldInfos )
{
if (fieldInfos == null || fieldInfos.Count < 1)
{
return new object();
}
//创建编译器实例。
CSharpCodeProvider provider = new CSharpCodeProvider();
//设置编译参数。
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true;
//paras.OutputAssembly = "c:\\1.dll";
paras.ReferencedAssemblies.Add("System.dll");
paras.ReferencedAssemblies.Add("System.Data.dll");
//创建动态代码。
StringBuilder classSource = new StringBuilder();
classSource.Append("public class "+ classname + " \n");
classSource.Append("{\n");
//创建属性。
foreach (var cl in fieldInfos)
{
classSource.Append(propertyString(cl.Display));
}
classSource.Append("}");
System.Diagnostics.Debug.WriteLine(classSource.ToString());
//编译代码。
CompilerResults result = provider.CompileAssemblyFromSource(paras, classSource.ToString());
if (result.Errors.Count > 0)
{
for (int i = 0; i < result.Errors.Count; i++)
Console.WriteLine(result.Errors[i]);
Console.WriteLine("error");
return null;
}
//获取编译后的程序集。
Assembly assembly = result.CompiledAssembly;
object obclass = assembly.CreateInstance(classname);
foreach (var cl in fieldInfos)
{
//ReflectionSetProperty(obclass, cl.ColumnName, dt.Rows[0][cl.ColumnName].ToString());
PropertyInfo _Property = obclass.GetType().GetProperty(cl.Display);
if (_Property != null)
{
_Property.SetValue(obclass, cl.Fieldvalue, null);
}
}
return obclass;
}
private static string propertyString(string propertyName)
{
StringBuilder sbProperty = new StringBuilder();
sbProperty.Append(" private string _" + propertyName + " =string.Empty;\n");
sbProperty.Append(" public string " + "" + propertyName + "\n");
sbProperty.Append(" {\n");
sbProperty.Append(" get{ return _" + propertyName + ";} \n");
sbProperty.Append(" set{ _" + propertyName + " = value; }\n");
sbProperty.Append(" }");
return sbProperty.ToString();
}
//将Image转换成流数据并保存为byte[]
public static byte[] PhotoImageInsert(System.Drawing.Image imgPhoto)
{
MemoryStream mstream = new MemoryStream();
imgPhoto.Save(mstream, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] byData = new Byte[mstream.Length];
mstream.Position = 0;
mstream.Read(byData, 0, byData.Length); mstream.Close();
return byData;
}
public static BitmapImage BitmapToBitmapImage(byte[] img)
{
BitmapImage bitmapImage = new BitmapImage();
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(img))
{
bitmapImage.BeginInit();
bitmapImage.StreamSource = ms;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();
}
return bitmapImage;
}
public static BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap)
{
BitmapImage bitmapImage = new BitmapImage();
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
bitmap.Save(ms, bitmap.RawFormat);
bitmapImage.BeginInit();
bitmapImage.StreamSource = ms;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();
}
return bitmapImage;
}
}
}