إنشاء اختيارات: بت في الوجه من خلال التقريب العشري؟

StackOverflow https://stackoverflow.com/questions/1299706

  •  18-09-2019
  •  | 
  •  

سؤال

أنا حاليا تنفيذ فئة تسمى الموقف في WPF. انها مشتقة من فئة الشكل.

يبدو بشكل أساسي مثل هذا:

public class SelectionBorder : Shape
{
   public Point StartPoint {get; set;}
   public PointCollection Points {get; set;}

   public double StrokeLength {get; set;}

   protected override Geometry DefiningGeometry{
       get{
           //Magic!
       }
   }

}

تحدد خصائص نقاط التشغيل والنقاط زوايا الحدود. الحدود عبارة عن حدود خط مقلدة نموذجية (ضربة واحدة سوداء واحدة، ضربة واحدة غير مرئية مثل ذلك: - - - -)

المشكلة التي لدي الآن هي أنه نظرا لأن نقاط الزاوية غير قابلة للتخيني بحرية، فمن الشائع جدا أن يكون عدد السكتات الدماغية (وهذا السكتات الدماغية السوداء وغير المرئية) ليس حتى (في الواقع غير صحيح) وبالتالي تبدو السكتة الدماغية الأولى أطول من الآخرين (مرئي في الصورة). هذا ربما لا يبدو أنه صفقة كبيرة ولكني أريد لاحقا أن تحريك الحدود بحيث تقوم دائرة السكتات الدماغية بجولة المحتوى. عند القيام بهذه الرسوم المتحركة، يصبح الخلل الصغير في العرض الثابت مرئيا بوضوح وفي رأيي مزعج للغاية.

نص Alt http://img14.imageshack.us/img14/2874/selectionborder.png.

المشكلة هي أنني حاولت تحديد طول Strokelength الذي يصل إلى قريبة من Strokelength الأصلي قدر الإمكان ويخلق عدد حتى من السكتات الدماغية. ومع ذلك، فإن المشكلة التي قمت بتشغيلها هي أن WPF (من الواضح) لا يمكنه عرض الدقة بأكملها من طول Strokelength المزدوج العشري وبالتالي فإن رقم السكتة الدماغ الناتج غير متكافئ مرة أخرى.

هل هناك أي حل لهذه المشكلة؟ هل من المحتمل أن يكون لديك حل آخر لمشكلتي؟

شكرا مقدما!

تحرير: لقد اختتم واستعرض التعليمات البرمجية بعد استراحة صغيرة للياقة البدنية اليوم وبعد كل شيء يحدث فقط على أطوال ستروكيل كبيرة جدا. أخطط لاستخدام أطوال ستروكيل من 2 حيث القفز الرسوم المتحركة الصغير يهم أقل بكثير مما اعتقدت أصلا.

هل كانت مفيدة؟

المحلول 2

أنا فقط وجدت طريقة تجعلها أسهل في إنشاء مثل هذه الظهور المتحركة.

بدلا من إنشاء الرسوم المتحركة عن طريق تحريك نقطة متحركة تم إنشاؤها ذاتيا من خلال الرسوم المتحركة، قمت فقط بتحريك خاصية StrokeDashoffet المتوفرة التي توفرها فئة الشكل وإعداد Strokedasharray لتحديد طول Strokelength.

يبدو أن هذا في XAML:

<namespace:SelectionBorder StrokeDashArray="2" AnimationDuration="0:0:1" Stroke="Black" />

فئة تبدو وكأنها هذه:

public class SelectionBorder : Shape
{
    private DoubleAnimation m_Animation;
    private bool m_AnimationStarted;

    public SelectionBorder()
    {
        IsVisibleChanged += OnIsVisibleChanged;
    }

    protected void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if (Visibility == Visibility.Visible)
        {
            StartAnimation();
        }
        else
        {
            StopAnimation();
        }
    }

    public void StartAnimation()
    {
        if (m_AnimationStarted)
            return;

        if (m_Animation == null)
        {
            m_Animation = CreateAnimation();
        }

        BeginAnimation(StrokeDashOffsetProperty, m_Animation);
        m_AnimationStarted = true;
    }

    protected virtual DoubleAnimation CreateAnimation()
    {
        DoubleAnimation animation = new DoubleAnimation();
        animation.From = 0;
        if (StrokeDashArray.Count == 0)
            animation.To = 4;
        else
            animation.To = StrokeDashArray.First() * 2;
        animation.Duration = AnimationDuration;
        animation.RepeatBehavior = RepeatBehavior.Forever;
        return animation;
    }

    public void StopAnimation()
    {
        if (m_AnimationStarted)
        {
            BeginAnimation(StrokeDashOffsetProperty, null);
            m_AnimationStarted = false;
        }
    }

    #region Dependency Properties

    public Duration AnimationDuration
    {
        get { return (Duration)GetValue(AnimationDurationProperty); }
        set { SetValue(AnimationDurationProperty, value); }
    }

    public static readonly DependencyProperty AnimationDurationProperty =
        DependencyProperty.Register("AnimationDuration", typeof(Duration), typeof(SelectionBorder), new UIPropertyMetadata(new Duration(TimeSpan.FromSeconds(0.5))));


    #endregion Dependency Properties

    protected override Geometry DefiningGeometry
    {
        get
        {
            double width = (double.IsNaN(Width)) ? ((Panel)Parent).ActualWidth : Width;
            double height = (double.IsNaN(Height)) ? ((Panel)Parent).ActualHeight : Height;

            RectangleGeometry geometry = new RectangleGeometry(new Rect(0, 0, width, height));

            return geometry;
        }
    }
}

نصائح أخرى

يمكنك أن تجعل أكثر من ركن "غير متطابقة" في هذا الصدد. على سبيل المثال، بدلا من وجود نقطة واحدة تكون "المصدر" و "الوجهة" من شرطات الرسوم المتحركة، يمكنك اختيار 2 نقطة. يمكن للمرء أن يكون "المصدر"، حيث يبدو أن الشرطات مسيرة بعيدا عنها في اتجاهين، ونقطة أخرى تكون "الوجهة"، حيث تتلاقى شرطات وتختفي.

على سبيل المثال، تحريك خطوط اختيار مختارة بهذه الطريقة ويبدو أنها تختار نقطة الأقرب إلى أسفل اليسار إلى أسفل اليسار ل "المصدر" والنقطة الأقرب إلى الجزء العلوي الأيمن ل "الوجهة".

هل يمكن أن تأتي مع بعض المخطط الآخر، كذلك.

فقط تذكر أنه في حين أنه قد تبدو مقلقة لك، فإن معظم المستخدمين لن يهتمون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top