باستخدام الرسوم المتحركة القصة المصورة على السيطرة المضافة برمجيا،

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

  •  22-08-2019
  •  | 
  •  

سؤال

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

        void settingsButton_Clicked(object sender, EventArgs e)
    {
        ContentCanvas.Children.Clear();

        // Fade in settings panel
        NameScope.SetNameScope(this, new NameScope());

        SettingsPane s = new SettingsPane();
        s.Name = "settingsPane";

        this.RegisterName(s.Name, s);
        this.Resources.Add(s.Name, s);

        Storyboard sb = new Storyboard();

        DoubleAnimation settingsFade = new DoubleAnimation();
        settingsFade.From = 0;
        settingsFade.To = 1;
        settingsFade.Duration = new Duration(TimeSpan.FromSeconds(0.33));
        settingsFade.RepeatBehavior = new RepeatBehavior(1);
        Storyboard.SetTargetName(settingsFade, s.Name);
        Storyboard.SetTargetProperty(settingsFade, new PropertyPath(UserControl.OpacityProperty));

        ContentCanvas.Children.Add(s);

        sb.Children.Add(settingsFade);
        sb.Begin();
    }

ولكن، عند تشغيل هذا الرمز، أحصل على خطأ "لا مجال اسم ينطبق موجود لحل اسم 'settingsPane".

ما أنا ربما فعل خاطئ؟ أنا متأكد من أنني قد سجلت كل شيء بشكل صحيح: (

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

المحلول

وأود أن لا مشاحنات مع NameScopes وغيرها، ويفضل استخدام Storyboard.SetTarget بدلا من ذلك.

var b = new Button() { Content = "abcd" };
stack.Children.Add(b);

var fade = new DoubleAnimation()
{
    From = 0,
    To = 1,
    Duration = TimeSpan.FromSeconds(5),
};

Storyboard.SetTarget(fade, b);
Storyboard.SetTargetProperty(fade, new PropertyPath(Button.OpacityProperty));

var sb = new Storyboard();
sb.Children.Add(fade);

sb.Begin();

نصائح أخرى

وأنا حل المشكلة باستخدام هذا كمعلمة في طريقة البدء، في محاولة:

sb.Begin(this);

ولأن تسجيل الاسم في الإطار.

وأنا أتفق، وnamescopes وربما يكون الشيء الخطأ استخدامه لهذا السيناريو. كثيرا أبسط وأسهل للاستخدام SetTarget بدلا من SetTargetName.

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

    TableCell cell = table.RowGroups[0].Rows[row].Cells[col];

    // The cell contains just one paragraph; it is the first block
    Paragraph p = (Paragraph)cell.Blocks.FirstBlock;

    // Animate the paragraph: fade the background from Yellow to White,
    // once, through a span of 6 seconds.

    SolidColorBrush brush = new SolidColorBrush(Colors.Yellow);
    p.Background = brush;
    ColorAnimation ca1 = new ColorAnimation()
    {
            From = Colors.Yellow,
            To = Colors.White,
            Duration = new Duration(TimeSpan.FromSeconds(6.0)),
            RepeatBehavior = new RepeatBehavior(1),
            AutoReverse = false,
    };

    brush.BeginAnimation(SolidColorBrush.ColorProperty, ca1);

ومن الممكن الشيء الغريب ولكن لي الحل هو استخدام كلتا الطريقتين:

Storyboard.SetTargetName(DA, myObjectName);

Storyboard.SetTarget(DA, myRect);

sb.Begin(this);

في هذه الحالة لا يوجد أي خطأ.

وإلقاء نظرة على التعليمات البرمجية حيث ولقد استخدمت ذلك.

 int n = 0;
        bool isWorking;
        Storyboard sb;
        string myObjectName;
         UIElement myElement;

        int idx = 0;

        void timer_Tick(object sender, EventArgs e)
        {
            if (isWorking == false)
            {
                isWorking = true;
                try
                {
                      myElement = stackObj.Children[idx];

                    var possibleIDX = idx + 1;
                    if (possibleIDX == stackObj.Children.Count)
                        idx = 0;
                    else
                        idx++;

                    var myRect = (Rectangle)myElement;

                   // Debug.WriteLine("TICK: " + myRect.Name);

                    var dur = TimeSpan.FromMilliseconds(2000);

                    var f = CreateVisibility(dur, myElement, false);

                    sb.Children.Add(f);

                    Duration d = TimeSpan.FromSeconds(2);
                    DoubleAnimation DA = new DoubleAnimation() { From = 1, To = 0, Duration = d };

                    sb.Children.Add(DA);
                    myObjectName = myRect.Name;  
                   Storyboard.SetTargetName(DA, myObjectName);
                   Storyboard.SetTarget(DA, myRect);

                    Storyboard.SetTargetProperty(DA, new PropertyPath("Opacity"));

                    sb.Begin(this);

                    n++;
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message + "   " + DateTime.Now.TimeOfDay);
                }

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