using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; 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 FLY.ControlLibrary { /// /// PercentRing.xaml 的交互逻辑 /// public partial class PercentRing : UserControl, INotifyPropertyChanged { #region 附加属性 /// /// 比例 /// public static readonly DependencyProperty RatioProperty = DependencyProperty.Register("Ratio", typeof(double), typeof(PercentRing), new PropertyMetadata(0.3, new PropertyChangedCallback(delegate (DependencyObject d, DependencyPropertyChangedEventArgs e) { }))); /// /// 比例 /// public double Ratio { get { return (double)GetValue(RatioProperty); } set { SetValue(RatioProperty, value); NotifyPropertyChanged("Ratio"); } } /// /// 总量 /// public static readonly DependencyProperty TotalProperty = DependencyProperty.Register("Total", typeof(double), typeof(PercentRing), new PropertyMetadata(1.0)); /// /// 总量 /// public double Total { get { return (double)GetValue(RatioProperty); } set { if (value != Total) { SetValue(RatioProperty, value); NotifyPropertyChanged("Total"); } } } /// /// 字的颜色 /// public static readonly DependencyProperty ColorTextProperty = DependencyProperty.Register("ColorText", typeof(Brush), typeof(PercentRing), new PropertyMetadata(new SolidColorBrush(Color.FromRgb(0x46,0x46,0x46)))); /// /// 字的颜色 /// public Brush ColorText { get { return (Brush)GetValue(ColorTextProperty); } set { if (value != ColorText) { SetValue(ColorTextProperty, value); NotifyPropertyChanged("ColorText"); } } } /// /// 单位的颜色 /// public static readonly DependencyProperty ColorUnitProperty = DependencyProperty.Register("ColorUnit", typeof(Brush), typeof(PercentRing), new PropertyMetadata(new SolidColorBrush(Color.FromRgb(0x46, 0x46, 0x46)))); /// /// 单位的颜色 /// public Brush ColorUnit { get { return (Brush)GetValue(ColorUnitProperty); } set { if (value != ColorUnit) { SetValue(ColorUnitProperty, value); NotifyPropertyChanged("ColorUnit"); } } } #endregion /// /// /// public PercentRing() { InitializeComponent(); //this.DataContext = this; Draw(); } void Draw() { arc_value.DataContext = this; run_value.DataContext = this; run_unit.DataContext = this; } #region INotifyPropertyChanged 成员 public void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; #endregion } public class Percent2AngleConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (!(value is double)) return 0; double d = (double)value; return d * 360; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class Percent2AngleMultiConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values.Length != 2) return 0; if (!(values[0] is double)) return 0; if (!(values[1] is double)) return 0; double d = (double)values[0] / ((double)values[1]); return d * 360; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class PercentConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (!(value is double)) return 0; double d = (double)value; return d * 100; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class PercentMultiConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values.Length != 2) return 0; if (!(values[0] is double)) return 0; if (!(values[1] is double)) return 0; double d = (double)values[0] / ((double)values[1]); return d * 100; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } public class TestUnit_PercentRing { public double Ratio { get; set; } public double Total { get; set; } public Brush ColorText { get; set; } public Brush ColorUnit { get; set; } } }