Merge branch 'master' into master

This commit is contained in:
NaBian authored and GitHub committed 2020-07-12 00:09:38 +08:00
commit ea8c8a9795
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
}
}