在我的应用程序

时间:2015-07-29 13:44:50

标签: c# .net wpf

我找到了CircularProgressBar .cs的实施。 这是public partial class CircularProgressBar : UserControl { public CircularProgressBar() { InitializeComponent(); Angle = (Percentage * 360) / 100; RenderArc(); } public int Radius { get { return (int)GetValue(RadiusProperty); } set { SetValue(RadiusProperty, value); } } public Brush SegmentColor { get { return (Brush)GetValue(SegmentColorProperty); } set { SetValue(SegmentColorProperty, value); } } public int StrokeThickness { get { return (int)GetValue(StrokeThicknessProperty); } set { SetValue(StrokeThicknessProperty, value); } } public double Percentage { get { return (double)GetValue(PercentageProperty); } set { SetValue(PercentageProperty, value); } } public double Angle { get { return (double)GetValue(AngleProperty); } set { SetValue(AngleProperty, value); } } // Using a DependencyProperty as the backing store for Percentage. This enables animation, styling, binding, etc... public static readonly DependencyProperty PercentageProperty = DependencyProperty.Register("Percentage", typeof(double), typeof(CircularProgressBar), new PropertyMetadata(65d, new PropertyChangedCallback(OnPercentageChanged))); // Using a DependencyProperty as the backing store for StrokeThickness. This enables animation, styling, binding, etc... public static readonly DependencyProperty StrokeThicknessProperty = DependencyProperty.Register("StrokeThickness", typeof(int), typeof(CircularProgressBar), new PropertyMetadata(1)); // Using a DependencyProperty as the backing store for SegmentColor. This enables animation, styling, binding, etc... public static readonly DependencyProperty SegmentColorProperty = DependencyProperty.Register("SegmentColor", typeof(Brush), typeof(CircularProgressBar), new PropertyMetadata(new SolidColorBrush(Colors.Red))); // Using a DependencyProperty as the backing store for Radius. This enables animation, styling, binding, etc... public static readonly DependencyProperty RadiusProperty = DependencyProperty.Register("Radius", typeof(int), typeof(CircularProgressBar), new PropertyMetadata(105, new PropertyChangedCallback(OnPropertyChanged))); // Using a DependencyProperty as the backing store for Angle. This enables animation, styling, binding, etc... public static readonly DependencyProperty AngleProperty = DependencyProperty.Register("Angle", typeof(double), typeof(CircularProgressBar), new PropertyMetadata(120d, new PropertyChangedCallback(OnPropertyChanged))); private static void OnPercentageChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { CircularProgressBar circle = sender as CircularProgressBar; circle.Angle = (circle.Percentage * 270) / 100; } private static void OnPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { CircularProgressBar circle = sender as CircularProgressBar; circle.RenderArc(); } public void RenderArc() { Point startPoint = new Point(Radius, 0); Point endPoint = ComputeCartesianCoordinate(Angle, Radius); endPoint.X += Radius; endPoint.Y += Radius; pathRoot.Width = Radius * 2 + StrokeThickness; pathRoot.Height = Radius * 2 + StrokeThickness; pathRoot.Margin = new Thickness(StrokeThickness, StrokeThickness, 0, 0); bool largeArc = Angle > 180.0; Size outerArcSize = new Size(Radius, Radius); pathFigure.StartPoint = startPoint; if (startPoint.X == Math.Round(endPoint.X) && startPoint.Y == Math.Round(endPoint.Y)) endPoint.X -= 0.01; arcSegment.Point = endPoint; arcSegment.Size = outerArcSize; arcSegment.IsLargeArc = largeArc; } private Point ComputeCartesianCoordinate(double angle, double radius) { // convert to radians double angleRad = (Math.PI / 180.0) * (angle - 90); double x = radius * Math.Cos(angleRad); double y = radius * Math.Sin(angleRad); return new Point(x, y); } } 文件:

Circular

因为我不想完整private static void OnPercentageChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { CircularProgressBar circle = sender as CircularProgressBar; circle.Angle = (circle.Percentage * 360) / 100; } 但只有一半我改变了这个:

180

并设置360的值而不是Circular。 现在我想在我的应用程序中添加相同的控件,但这次我希望这个Circle完整NSRange所以我的问题是我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以创建另一个依赖项属性,它将作为循环进度条的模式

    public enum Modes
    {
        Full = 360,
        Half = 180
    }

    public Modes CircularMode
    {
        get { return (Modes)GetValue(CircularModeProperty); }
        set { SetValue(CircularModeProperty, value); }
    }

    public static readonly DependencyProperty CircularModeProperty =
        DependencyProperty.Register("CircularMode", typeof(Modes), typeof(CircularProgressBar), new PropertyMetadata(Modes.Full));

然后,您可以在计算中使用此值:

circle.Angle = (circle.Percentage * (int)circle.CircularMode) / 100;

用法:

<xyz:CircularProgressBar CircularMode="Half" ... 

或者

<xyz:CircularProgressBar CircularMode="Full" ... 

注意:'xyz'只是一个示例命名空间定义,在您的应用程序中很可能会有所不同。