Merge branch 'master' into master
This commit is contained in:
608 files changed
+11322
-6260
No files matched your search
@@ -1,14 +1,13 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
#if !netle40
|
||||
#if !NET40
|
||||
using System.Runtime.CompilerServices;
|
||||
#endif
|
||||
using System.Windows;
|
||||
using System.Windows.Markup;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Navigation;
|
||||
using HandyControl.Controls;
|
||||
using HandyControl.Data;
|
||||
using HandyControl.Properties.Langs;
|
||||
|
||||
@@ -38,7 +37,7 @@ namespace HandyControl.Tools
|
||||
}
|
||||
}
|
||||
|
||||
public void SetSystemVersionInfo(SystemVersionInfo info) => BlurWindow.SystemVersionInfo = info;
|
||||
public SystemVersionInfo SystemVersionInfo { get; set; }
|
||||
|
||||
public void SetLang(string lang)
|
||||
{
|
||||
@@ -49,7 +48,7 @@ namespace HandyControl.Tools
|
||||
|
||||
public void SetConfig(HandyControlConfig config)
|
||||
{
|
||||
SetSystemVersionInfo(config.SystemVersionInfo);
|
||||
SystemVersionInfo = config.SystemVersionInfo;
|
||||
SetLang(config.Lang);
|
||||
SetTimelineFrameRate(config.TimelineFrameRate);
|
||||
}
|
||||
@@ -60,10 +59,10 @@ namespace HandyControl.Tools
|
||||
public void SetWindowDefaultStyle(object resourceKey = null)
|
||||
{
|
||||
var metadata = resourceKey == null
|
||||
? new FrameworkPropertyMetadata(Application.Current.FindResource(typeof(System.Windows.Window)))
|
||||
? new FrameworkPropertyMetadata(Application.Current.FindResource(typeof(Window)))
|
||||
: new FrameworkPropertyMetadata(Application.Current.FindResource(resourceKey));
|
||||
|
||||
FrameworkElement.StyleProperty.OverrideMetadata(typeof(System.Windows.Window), metadata);
|
||||
FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), metadata);
|
||||
}
|
||||
|
||||
public void SetNavigationWindowDefaultStyle(object resourceKey = null)
|
||||
@@ -77,7 +76,7 @@ namespace HandyControl.Tools
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
#if netle40
|
||||
#if NET40
|
||||
protected virtual void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using HandyControl.Expression.Drawing;
|
||||
using HandyControl.Tools.Interop;
|
||||
|
||||
namespace HandyControl.Tools
|
||||
@@ -17,8 +18,12 @@ namespace HandyControl.Tools
|
||||
var dC = InteropMethods.GetDC(IntPtr.Zero);
|
||||
if (dC != IntPtr.Zero)
|
||||
{
|
||||
DeviceDpiX = InteropMethods.GetDeviceCaps(dC, 88);
|
||||
DeviceDpiY = InteropMethods.GetDeviceCaps(dC, 90);
|
||||
// 沿着屏幕宽度每逻辑英寸的像素数。在具有多个显示器的系统中,这个值对所有显示器都是相同的
|
||||
const int logicPixelsX = 88;
|
||||
// 沿着屏幕高度每逻辑英寸的像素数
|
||||
const int logicPixelsY = 90;
|
||||
DeviceDpiX = InteropMethods.GetDeviceCaps(dC, logicPixelsX);
|
||||
DeviceDpiY = InteropMethods.GetDeviceCaps(dC, logicPixelsY);
|
||||
InteropMethods.ReleaseDC(IntPtr.Zero, dC);
|
||||
}
|
||||
else
|
||||
@@ -75,5 +80,25 @@ namespace HandyControl.Tools
|
||||
result.Transform(TransformFromDevice.Matrix);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static double RoundLayoutValue(double value, double dpiScale)
|
||||
{
|
||||
double newValue;
|
||||
|
||||
if (!MathHelper.AreClose(dpiScale, 1.0))
|
||||
{
|
||||
newValue = Math.Round(value * dpiScale) / dpiScale;
|
||||
if (double.IsNaN(newValue) || double.IsInfinity(newValue) || MathHelper.AreClose(newValue, double.MaxValue))
|
||||
{
|
||||
newValue = value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
newValue = Math.Round(value);
|
||||
}
|
||||
|
||||
return newValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace HandyControl.Tools
|
||||
{
|
||||
/// <summary>
|
||||
/// 输入层点击帮助类
|
||||
/// </summary>
|
||||
public static class InputClickHelper
|
||||
{
|
||||
private static readonly DependencyProperty InputInfoProperty = DependencyProperty.RegisterAttached(
|
||||
"InputInfo", typeof(InputInfo), typeof(InputClickHelper), new PropertyMetadata(default(InputInfo)));
|
||||
|
||||
private static void SetInputInfo(DependencyObject element, InputInfo value) => element.SetValue(InputInfoProperty, value);
|
||||
|
||||
private static InputInfo GetInputInfo(DependencyObject element) => (InputInfo)element.GetValue(InputInfoProperty);
|
||||
|
||||
/// <summary>
|
||||
/// 将 MouseDown MouseMove MouseUp 封装为点击事件
|
||||
/// </summary>
|
||||
/// <param name="element">要被附加的元素</param>
|
||||
/// <param name="clickEventHandler">点击的事件</param>
|
||||
/// <param name="dragStarted">因为拖动而结束点击时触发</param>
|
||||
public static void AttachMouseDownMoveUpToClick(UIElement element, EventHandler clickEventHandler,
|
||||
EventHandler dragStarted = null)
|
||||
{
|
||||
var inputInfo = GetOrCreateInputInfo(element);
|
||||
inputInfo.ClickEventHandler += clickEventHandler;
|
||||
|
||||
inputInfo.DragStarted += dragStarted;
|
||||
|
||||
element.MouseDown -= Element_MouseDown;
|
||||
element.MouseDown += Element_MouseDown;
|
||||
element.MouseMove -= Element_MouseMove;
|
||||
element.MouseMove += Element_MouseMove;
|
||||
element.MouseUp -= Element_MouseUp;
|
||||
element.MouseUp += Element_MouseUp;
|
||||
element.LostMouseCapture -= Element_LostMouseCapture;
|
||||
element.LostMouseCapture += Element_LostMouseCapture;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 去掉对 <paramref name="element" /> 的点击时间的监听
|
||||
/// </summary>
|
||||
/// <param name="element"></param>
|
||||
/// <param name="clickEventHandler">点击的事件</param>
|
||||
/// <param name="dragStarted">因为拖动而结束点击时触发的事件</param>
|
||||
public static void DetachMouseDownMoveUpToClick(UIElement element, EventHandler clickEventHandler,
|
||||
EventHandler dragStarted = null)
|
||||
{
|
||||
var inputInfo = GetInputInfo(element);
|
||||
if (inputInfo == null) return;
|
||||
|
||||
inputInfo.ClickEventHandler -= clickEventHandler;
|
||||
inputInfo.DragStarted -= dragStarted;
|
||||
|
||||
if (inputInfo.IsEmpty())
|
||||
{
|
||||
element.ClearValue(InputInfoProperty);
|
||||
element.MouseDown -= Element_MouseDown;
|
||||
element.MouseMove -= Element_MouseMove;
|
||||
element.MouseUp -= Element_MouseUp;
|
||||
element.LostMouseCapture -= Element_LostMouseCapture;
|
||||
}
|
||||
}
|
||||
|
||||
private static void Element_LostMouseCapture(object sender, MouseEventArgs e)
|
||||
{
|
||||
var element = (UIElement)sender;
|
||||
GetInputInfo(element)?.LostCapture();
|
||||
}
|
||||
|
||||
private static void Element_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var element = (UIElement)sender;
|
||||
GetInputInfo(element)?.Up(e.GetPosition(element));
|
||||
}
|
||||
|
||||
private static void Element_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
var element = (UIElement)sender;
|
||||
GetInputInfo(element)?.Move(e.GetPosition(element));
|
||||
}
|
||||
|
||||
private static void Element_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var element = (UIElement)sender;
|
||||
GetInputInfo(element)?.Down(e.GetPosition(element));
|
||||
}
|
||||
|
||||
private static InputInfo GetOrCreateInputInfo(UIElement element)
|
||||
{
|
||||
var inputInfo = GetInputInfo(element);
|
||||
if (inputInfo == null)
|
||||
{
|
||||
inputInfo = new InputInfo();
|
||||
SetInputInfo(element, inputInfo);
|
||||
}
|
||||
|
||||
return inputInfo;
|
||||
}
|
||||
|
||||
private class InputInfo
|
||||
{
|
||||
private const double ToleranceSquared = 0.01;
|
||||
|
||||
private Point _downedPosition;
|
||||
|
||||
private bool _isClick;
|
||||
|
||||
public event EventHandler ClickEventHandler;
|
||||
|
||||
public event EventHandler DragStarted;
|
||||
|
||||
public void Down(Point position)
|
||||
{
|
||||
_downedPosition = position;
|
||||
_isClick = true;
|
||||
}
|
||||
|
||||
public void Move(Point position)
|
||||
{
|
||||
if (!_isClick) return;
|
||||
|
||||
if ((position - _downedPosition).LengthSquared > ToleranceSquared)
|
||||
{
|
||||
_isClick = false;
|
||||
DragStarted?.Invoke(null, EventArgs.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
public void Up(Point position)
|
||||
{
|
||||
_isClick = _isClick && (position - _downedPosition).LengthSquared <= ToleranceSquared;
|
||||
|
||||
if (!_isClick) return;
|
||||
|
||||
ClickEventHandler?.Invoke(null, EventArgs.Empty);
|
||||
|
||||
_isClick = false;
|
||||
}
|
||||
|
||||
public void LostCapture() => _isClick = false;
|
||||
|
||||
public bool IsEmpty() => ClickEventHandler is null && DragStarted is null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,7 @@ namespace HandyControl.Tools
|
||||
|
||||
public static T GetChild<T>(DependencyObject d) where T : DependencyObject
|
||||
{
|
||||
if (d == null) return default;
|
||||
if (d is T t) return t;
|
||||
|
||||
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(d); i++)
|
||||
|
||||
@@ -132,15 +132,17 @@ namespace HandyControl.Tools
|
||||
{
|
||||
get
|
||||
{
|
||||
#if netle40
|
||||
return WindowResizeBorderThickness;
|
||||
InteropValues.APPBARDATA appBarData = default;
|
||||
var autoHide = InteropMethods.SHAppBarMessage(4, ref appBarData) != 0;
|
||||
#if NET40
|
||||
return WindowResizeBorderThickness.Add(new Thickness(autoHide ? -8 : 0));
|
||||
#elif Core
|
||||
var hdc = InteropMethods.GetDC(IntPtr.Zero);
|
||||
var scale = InteropMethods.GetDeviceCaps(hdc, InteropValues.DESKTOPVERTRES) / (float)InteropMethods.GetDeviceCaps(hdc, InteropValues.VERTRES);
|
||||
InteropMethods.ReleaseDC(IntPtr.Zero, hdc);
|
||||
return WindowResizeBorderThickness.Add(new Thickness(4 * scale));
|
||||
return WindowResizeBorderThickness.Add(new Thickness((autoHide ? - 4 : 4) * scale));
|
||||
#else
|
||||
return WindowResizeBorderThickness.Add(new Thickness(4));
|
||||
return WindowResizeBorderThickness.Add(new Thickness(autoHide ? - 4 : 4));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user