using Microsoft.Xaml.Behaviors; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; namespace FLY.ControlLibrary { /// <summary> /// 后台添加功能,按钮按下 时 属性=true, 抬起属性=false /// </summary> public class ResetAction2 : IDisposable { /// <summary> /// 对象 /// </summary> public object obj; /// <summary> /// bool 属性 /// </summary> public string propertyname; /// <summary> /// 按下时为 true /// </summary> public bool pressIsTrue; UIElement uIElement; /// <summary> /// /// </summary> /// <param name="uIElement"></param> /// <param name="obj"></param> /// <param name="propertyname"></param> /// <param name="pressIsTrue"></param> public ResetAction2(UIElement uIElement, object obj, string propertyname, bool pressIsTrue = true) { this.uIElement = uIElement; this.obj = obj; this.propertyname = propertyname; this.pressIsTrue = pressIsTrue; uIElement.PreviewMouseDown += UIElement_PreviewMouseDown; uIElement.PreviewTouchDown += UIElement_PreviewTouchDown; uIElement.PreviewMouseUp += UIElement_PreviewMouseUp; uIElement.PreviewTouchUp += UIElement_PreviewTouchUp; } /// <summary> /// /// </summary> /// <param name="uIElement"></param> /// <param name="obj"></param> /// <param name="propertyname"></param> /// <param name="pressIsTrue"></param> public ResetAction2(UIElement uIElement, string propertyname, bool pressIsTrue = true) { this.uIElement = uIElement; this.propertyname = propertyname; this.pressIsTrue = pressIsTrue; uIElement.PreviewMouseDown += UIElement_PreviewMouseDown; uIElement.PreviewTouchDown += UIElement_PreviewTouchDown; uIElement.PreviewMouseUp += UIElement_PreviewMouseUp; uIElement.PreviewTouchUp += UIElement_PreviewTouchUp; } public void Dispose() { uIElement.PreviewMouseDown -= UIElement_PreviewMouseDown; uIElement.PreviewTouchDown -= UIElement_PreviewTouchDown; uIElement.PreviewMouseUp -= UIElement_PreviewMouseUp; uIElement.PreviewTouchUp -= UIElement_PreviewTouchUp; } private void UIElement_PreviewTouchUp(object sender, TouchEventArgs e) { Up(); } private void UIElement_PreviewMouseUp(object sender, MouseButtonEventArgs e) { Up(); } private void UIElement_PreviewTouchDown(object sender, TouchEventArgs e) { Down(); } private void UIElement_PreviewMouseDown(object sender, MouseButtonEventArgs e) { Down(); } bool IsObjNull() { if (obj == null) { if (uIElement is FrameworkElement) { obj = (uIElement as FrameworkElement).DataContext; if (obj == null) return true; } else { return true; } } return false; } void Down() { if (IsObjNull()) return; if (pressIsTrue) Misc.PropertiesManager.SetValue(obj, propertyname, true); else Misc.PropertiesManager.SetValue(obj, propertyname, false); } void Up() { if (IsObjNull()) return; if (pressIsTrue) Misc.PropertiesManager.SetValue(obj, propertyname, false); else Misc.PropertiesManager.SetValue(obj, propertyname, true); } } /// <summary> /// ResetAction2 的 XAML 版 ,附加行为。 /// 还没完成 /// </summary> public class ResetBehavior : Behavior<UIElement> { public System.Windows.Data.Binding Binding { get; set; } ResetAction2 resetAction = null; public ResetBehavior() { } protected override void OnAttached() { base.OnAttached(); UIElement dobj = AssociatedObject; if (Binding != null && Binding.Path != null) { if (Binding.Source != null) { resetAction = new ResetAction2(dobj, Binding.Source, Binding.Path.Path); } else { var obj = COMMON.GetDataContext(dobj); if (obj == null) { resetAction = new ResetAction2(dobj, Binding.Path.Path); } else { resetAction = new ResetAction2(dobj, obj, Binding.Path.Path); } } } } protected override void OnDetaching() { base.OnDetaching(); if (resetAction != null) { resetAction.Dispose(); resetAction = null; } } } }