using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Future.Contract
{
    [TemplatePart(Name = "CloseHandle", Type = typeof(Button))]         //关闭按钮
    //[TemplatePart(Name = "OpacityArea", Type = typeof(UIElement))]      //透视区域
    public class DrawerTemplate : ContentControl
    {
        private Button? _CloseHandle;
        //private UIElement? _OpacityArea;
        static DrawerTemplate()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(DrawerTemplate), new FrameworkPropertyMetadata(typeof(DrawerTemplate)));
        }
        /// 
        /// 请求关闭事件
        /// 
        public event Action? ApplyCloseDrawer;
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            this._CloseHandle = this.Template.FindName("CloseHandle", this) as Button;
            //this._OpacityArea = this.Template.FindName("OpacityArea", this) as UIElement;
            if (this._CloseHandle != null) this._CloseHandle.Click += (s, e) => this.ApplyCloseDrawer?.Invoke();
        }
        public DrawerTemplate Clone() 
        {
            return new DrawerTemplate() 
            {
                Background = this.Background,
                Foreground = this.Foreground,
                BorderBrush = this.BorderBrush,
                BorderThickness = this.BorderThickness,
                HorizontalAlignment = this.HorizontalAlignment,
                VerticalAlignment = this.VerticalAlignment,
                HorizontalContentAlignment = this.HorizontalContentAlignment,
                VerticalContentAlignment = this.VerticalContentAlignment,
                Dock = this.Dock,
                FontFamily = this.FontFamily,
                FontSize = this.FontSize,
                FontStretch=this.FontStretch,
                FontStyle = this.FontStyle,
                FontWeight = this.FontWeight,
                //Template = this.Template,
                Style = this.Style
            };
        }
        #region   依赖属性
        /// 
        /// 抽屉标题
        /// 
        public string Title
        {
            get { return (string)GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }
        // Using a DependencyProperty as the backing store for Title.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(DrawerTemplate), new PropertyMetadata(""));
        /// 
        /// 停靠方向
        /// 
        public Dock Dock
        {
            get { return (Dock)GetValue(DockProperty); }
            set { SetValue(DockProperty, value); }
        }
        // Using a DependencyProperty as the backing store for Dock.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty DockProperty =
            DependencyProperty.Register("Dock", typeof(Dock), typeof(DrawerTemplate), new PropertyMetadata(Dock.Right));
        public Visibility HandleVisibility
        {
            get { return (Visibility)GetValue(HandleVisibilityProperty); }
            set { SetValue(HandleVisibilityProperty, value); }
        }
        // Using a DependencyProperty as the backing store for HandleVisibility.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty HandleVisibilityProperty =
            DependencyProperty.Register("HandleVisibility", typeof(Visibility), typeof(DrawerTemplate), new PropertyMetadata(Visibility.Visible));
        public double TitleHeight
        {
            get { return (double)GetValue(TitleHeightProperty); }
            set { SetValue(TitleHeightProperty, value); }
        }
        // Using a DependencyProperty as the backing store for TitleHeight.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TitleHeightProperty =
            DependencyProperty.Register("TitleHeight", typeof(double), typeof(DrawerTemplate), new PropertyMetadata(60.0));
        #endregion
    }
}