Files
HandyControl/Net35/HandyControl_Net35/Shell/WindowChrome.cs
T
2019-01-21 00:43:10 +08:00

212 lines
9.5 KiB
C#

namespace Microsoft.Windows.Shell
{
using Standard;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows;
using System.Windows.Data;
public class WindowChrome : Freezable
{
private static readonly List<_SystemParameterBoundProperty> _BoundProperties;
public static readonly DependencyProperty CaptionHeightProperty;
public static readonly DependencyProperty CornerRadiusProperty;
public static readonly DependencyProperty GlassFrameThicknessProperty;
public static readonly DependencyProperty IsHitTestVisibleInChromeProperty = DependencyProperty.RegisterAttached("IsHitTestVisibleInChrome", typeof(bool), typeof(WindowChrome), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Inherits));
public static readonly DependencyProperty ResizeBorderThicknessProperty;
public static readonly DependencyProperty WindowChromeProperty = DependencyProperty.RegisterAttached("WindowChrome", typeof(WindowChrome), typeof(WindowChrome), new PropertyMetadata(null, new PropertyChangedCallback(WindowChrome._OnChromeChanged)));
internal event EventHandler PropertyChangedThatRequiresRepaint;
static WindowChrome()
{
CaptionHeightProperty = DependencyProperty.Register("CaptionHeight", typeof(double), typeof(WindowChrome), new PropertyMetadata(0.0, (d, e) => ((WindowChrome) d)._OnPropertyChangedThatRequiresRepaint()), value => ((double) value) >= 0.0);
ResizeBorderThicknessProperty = DependencyProperty.Register("ResizeBorderThickness", typeof(Thickness), typeof(WindowChrome), new PropertyMetadata(new Thickness()), value => Standard.Utility.IsThicknessNonNegative((Thickness) value));
GlassFrameThicknessProperty = DependencyProperty.Register("GlassFrameThickness", typeof(Thickness), typeof(WindowChrome), new PropertyMetadata(new Thickness(), (d, e) => ((WindowChrome) d)._OnPropertyChangedThatRequiresRepaint(), (d, o) => _CoerceGlassFrameThickness((Thickness) o)));
CornerRadiusProperty = DependencyProperty.Register("CornerRadius", typeof(System.Windows.CornerRadius), typeof(WindowChrome), new PropertyMetadata(new System.Windows.CornerRadius(), (d, e) => ((WindowChrome) d)._OnPropertyChangedThatRequiresRepaint()), value => Standard.Utility.IsCornerRadiusValid((System.Windows.CornerRadius) value));
List<_SystemParameterBoundProperty> list = new List<_SystemParameterBoundProperty>();
_SystemParameterBoundProperty item = new _SystemParameterBoundProperty {
DependencyProperty = CornerRadiusProperty,
SystemParameterPropertyName = "WindowCornerRadius"
};
list.Add(item);
_SystemParameterBoundProperty property2 = new _SystemParameterBoundProperty {
DependencyProperty = CaptionHeightProperty,
SystemParameterPropertyName = "WindowCaptionHeight"
};
list.Add(property2);
_SystemParameterBoundProperty property3 = new _SystemParameterBoundProperty {
DependencyProperty = ResizeBorderThicknessProperty,
SystemParameterPropertyName = "WindowResizeBorderThickness"
};
list.Add(property3);
_SystemParameterBoundProperty property4 = new _SystemParameterBoundProperty {
DependencyProperty = GlassFrameThicknessProperty,
SystemParameterPropertyName = "WindowNonClientFrameThickness"
};
list.Add(property4);
_BoundProperties = list;
}
public WindowChrome()
{
foreach (_SystemParameterBoundProperty property in _BoundProperties)
{
Binding binding = new Binding {
Source = SystemParameters2.Current,
Path = new PropertyPath(property.SystemParameterPropertyName, new object[0]),
Mode = BindingMode.OneWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};
BindingOperations.SetBinding(this, property.DependencyProperty, binding);
}
}
private static object _CoerceGlassFrameThickness(Thickness thickness)
{
if (!Standard.Utility.IsThicknessNonNegative(thickness))
{
return GlassFrameCompleteThickness;
}
return thickness;
}
private static void _OnChromeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!DesignerProperties.GetIsInDesignMode(d))
{
Window window = (Window) d;
WindowChrome newValue = (WindowChrome) e.NewValue;
WindowChromeWorker windowChromeWorker = WindowChromeWorker.GetWindowChromeWorker(window);
if (windowChromeWorker == null)
{
windowChromeWorker = new WindowChromeWorker();
WindowChromeWorker.SetWindowChromeWorker(window, windowChromeWorker);
}
windowChromeWorker.SetWindowChrome(newValue);
}
}
private void _OnPropertyChangedThatRequiresRepaint()
{
EventHandler propertyChangedThatRequiresRepaint = this.PropertyChangedThatRequiresRepaint;
if (propertyChangedThatRequiresRepaint != null)
{
propertyChangedThatRequiresRepaint(this, EventArgs.Empty);
}
}
protected override Freezable CreateInstanceCore()
{
return new WindowChrome();
}
[SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters"), SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId="0")]
public static bool GetIsHitTestVisibleInChrome(IInputElement inputElement)
{
Standard.Verify.IsNotNull<IInputElement>(inputElement, "inputElement");
DependencyObject obj2 = inputElement as DependencyObject;
if (obj2 == null)
{
throw new ArgumentException("The element must be a DependencyObject", "inputElement");
}
return (bool) obj2.GetValue(IsHitTestVisibleInChromeProperty);
}
[SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters"), SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId="0")]
public static WindowChrome GetWindowChrome(Window window)
{
Standard.Verify.IsNotNull<Window>(window, "window");
return (WindowChrome) window.GetValue(WindowChromeProperty);
}
[SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters"), SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId="0")]
public static void SetIsHitTestVisibleInChrome(IInputElement inputElement, bool hitTestVisible)
{
Standard.Verify.IsNotNull<IInputElement>(inputElement, "inputElement");
DependencyObject obj2 = inputElement as DependencyObject;
if (obj2 == null)
{
throw new ArgumentException("The element must be a DependencyObject", "inputElement");
}
obj2.SetValue(IsHitTestVisibleInChromeProperty, hitTestVisible);
}
[SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters"), SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId="0")]
public static void SetWindowChrome(Window window, WindowChrome chrome)
{
Standard.Verify.IsNotNull<Window>(window, "window");
window.SetValue(WindowChromeProperty, chrome);
}
public double CaptionHeight
{
get
{
return (double) base.GetValue(CaptionHeightProperty);
}
set
{
base.SetValue(CaptionHeightProperty, value);
}
}
public System.Windows.CornerRadius CornerRadius
{
get
{
return (System.Windows.CornerRadius) base.GetValue(CornerRadiusProperty);
}
set
{
base.SetValue(CornerRadiusProperty, value);
}
}
public static Thickness GlassFrameCompleteThickness
{
get
{
return new Thickness(-1.0);
}
}
public Thickness GlassFrameThickness
{
get
{
return (Thickness) base.GetValue(GlassFrameThicknessProperty);
}
set
{
base.SetValue(GlassFrameThicknessProperty, value);
}
}
public Thickness ResizeBorderThickness
{
get
{
return (Thickness) base.GetValue(ResizeBorderThicknessProperty);
}
set
{
base.SetValue(ResizeBorderThicknessProperty, value);
}
}
[StructLayout(LayoutKind.Sequential)]
private struct _SystemParameterBoundProperty
{
public string SystemParameterPropertyName { get; set; }
public System.Windows.DependencyProperty DependencyProperty { get; set; }
}
}
}