تمام سوالات سوالات بدون پاسخ سوال بپرسید

سلام من تعدادی Storyboard دارم که میخوام بترتیب اجرا بشن. اما ظاهرا XAML فقط بصورت موازی و همه رو با هم اجرا میکنه. از دوستان کسی میتونه راهی برای اجرای ترتیبی این انیمیشن ها پیشنهاد کنه؟

3 پاسخ

سلام هر Storyboard یک اونت داره بنام Completed که زمانی که انیمیشن تمام میشه فراخونی میشه شما میتونید از این اونت استفاده کنید و با تمام شدن هر کدوم از انیمیشن ها در این اونت کد اجرای انیمیشن بعدی رو بنویسید و هم چنین کد ایجاد اونت Completed اون انیمیشن رو برای انیمیشن بعدی به این شکا از توالی اونها اطمینان حاصل میشه و در صورت توقف یک انیمیشن انیمیشن بعدی اجرا نمیشه

        private void Storyboard_Completed_1(object sender, EventArgs e)
    {
        System.Windows.Media.Animation.Storyboard onLoaded1 = (System.Windows.Media.Animation.Storyboard)(FindResource("OnLoaded1"));
        onLoaded1.Completed += new EventHandler(onLoaded1_Completed);
        onLoaded1.Begin();
    }

    void onLoaded1_Completed(object sender, EventArgs e)
    {
        System.Windows.Media.Animation.Storyboard onLoaded2 = (System.Windows.Media.Animation.Storyboard)(FindResource("OnLoaded2"));
        onLoaded2.Completed += new EventHandler(onLoaded2_Completed);
        onLoaded2.Begin();
    }

.
.
.

سلام دوست عزیز، فکر نمیکنی که این کار یه خورده کارایی رو پایین میاره؟ چون من برای مثلا 10 تا انیمیشن باید 10 تا ایونت بنویسم که تازه کار رو یه خورده پیچیده و کد رو کثیف می کنه.
اگه راه حل دیگه ای داشتی حتما به من هم بگو که برام خیلی مهمه. با تشکر

(07 مارس '12, 14:47) _Ant Eater_

این بستگی به خود شما داره ، اگر انیمیشن ها در هنگام اجرا به هیچ عنوان امکان توقف ندارن ، پس چرا 10 انیمیشن جدا همش رو یک انیمیشن کنید ( برای درست کردن برنامه ای باظاهر گرافیکی مناسب و زیبا و ساخت انیمیشن کمی باید وقت بگذارید ، حوصله کنید و کد بنویسید)

(10 مارس '12, 13:06) مهدی فرزاد

قطعا همینطوره ولی من بدنبال راهی می‌گردم که هم کد تمیز نگه داشته شود و هم مدیریت آن راحتر شود. تصور کن که انیمیشن رو با 10 مورد ترتیبی انجام دادی، برات راضی کننده نباشه. حالا سعی داری اون اوایل یک انیمیشن دیگه اضافه کنی... باید 10 انیمیشن دیگه رو اصلاح کنی، بعلاوه ایجاد یک رویداد جدید! این مدیریت رو بد میکنه و ضمن اینکه چنین چیزی اصلا مناسب محیط تجاری نیست. (اگر فرض کنیم رویدادها سربار زیادی ایجاد نمی‌کنند)

(04 ژانویه '13, 07:48) _Ant Eater_

سلام، برای انجام این کار می توانید از Timeline.BeginTime استفاده کنید. برای نمونه DoubleAnimation.BeginTime را می توانید به زمان مورد نظرتان Bind کنید. فرض کنید تعدادی StoryBoard دارید که می خواهید به ترتیب اجرا شوند. اگر زمان شروع آنها با هم به اندازه مشخصی فاصله داشته باشد می توانید DoubleAnimation.BeginTime آنها را به یک لیست Bind کنید. یا در مورد ItemsControl می توانید برای هر Item یک DataTemplate تعریف کرده و DoubleAnimation.BeginTime را به یک لیست که هر کدام یک فاصله زمانی مشخص دارد متصل کنید. دقت داشته باشید که DoubleAnimation.BeginTime از نوع <Nullable<TimeSpan تعریف شده است.

درسته و میشه اینکار رو کرد؛ اما فرض کن که من 4 تا انیمیشن دارم (Storyboard) که هر کدام باید بعد از قبلی اجرا بشه. حالا اینکه من بیام یک لیست درست کنم که زمانهای انیمیشن قبلی رو بهش بدم یه خورده زیادی کار رو پیچیده میکنه. ضمن اینکه Flexibility نداره. یعنی اینکه اگه بخوام ترتیب انیمشین ها رو عوض کنم یا اینکه طول انیمیشن یکی رو تغییر بدم، باید همه ی جدول رو دوباره محاسبه کنم. باز هم تشکر

(10 ژانویه '12, 06:51) _Ant Eater_

من به جواب قطعی نرسیدم ولی کاری که انجام داده ام رو با بقیه به اشتراک میگذارم شاید به درد کسی بخوره و راه حل بهتری هم پیدا بشه.
برای اجرای انیمیشن ها بصورت ترتیبی (Sequential) میشه از انیمیشن هایی که از keyFrame استفاده میکنند، بهره برد. یعنی شما برای هر انیمیشن زمان دقیق اجرا و keyFrame ها را بیان کنید. مثلا فرض کنید که یک دایره بخواهد ابتدا از چپ یه راست پنجره حرکت کنه و بعد به سمت بالا بره و بعد رنگش بنفش بشه و ... زمان شروع هر قسمت رو با زمان پایان قبلی منتبق میکنیم و کار انجام میشه.

<Storyboard BeginTime="0:0:0">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(StackPanel.RenderTransform).(TranslateTransform.X)">
        <SplineDoubleKeyFrame KeyTime="0:0:0.5" KeySpline="0,0 0.0,0.8" Value="200"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard BeginTime="0:0:0.5">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(StackPanel.RenderTransform).(TranslateTransform.Y)">
        <SplineDoubleKeyFrame KeyTime="0:0:0.5" KeySpline="0,0 0.0,0.8" Value="0"/>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

اما این روش خیلی دست و پا گیره. تصور کنین که انیمیشن شما 10 مرحله باشه. اگر تصمیم بگیرید که مثلا زمان انیمشین اولی 0.1 ثانیه کمتر بشه، مجبورید تمام زمانها را دوباره محاسبه و تصحیح کنید. علاوه بر این اگه مثلا یک لیست داشته باشید که بخواهید آیتم هایش به ترتیب و با انیمیشن ظاهر بشوند، دیگر به این روش نمیشه عمل کرد.
هر Storyboard ای یک رویداد به نام Complete داره که فقط از CodeBehind میشه بهش دسترسی داشت. بنابراین من در بعضی موارد از این روش استفاده کردم.
اما اگه یک لیست با انیمیشن هایی برای هر آیتم بخواهیم داشته باشم (یعنی هر آیتم که ظاهر مبشه با انیمیشن ظاهر بشه و تک به تک؛ نه همه با همدیگه) من یک انیمیشن برای خاصیت Load آیتم ها نوشتم (در DataTemplate) و بعد در CodeBehind یک لیست رو به ListBox ملحق کردم و با استفاده از یک تایمر در Codebehind یکی یکی آیتم ها روبه لیست اضافه کردم.

toggle preview



آموزش زبان برنامه نویسی C#
آموزش jquery
آموزش برنامه نویسی
آموزش طراحی وبسایت
آموزش مدیریت وبسایت
آموزش جاوا Java
آموزش پایتون Python
آموزش سی شارپ C#‎
آموزش HTML و CSS
آموزش JavaScript جاوااسکریپت
آموزش jQuery جی کوئری
آموزش ساخت ربات تلگرام
آموزش برنامه‌نویسی PHP
آموزش برنامه‌نویسی اندروید
● آموزش‌های رایگان

سوالات مرتبط

راهنمای استفاده از ویرایشگر
  • *ایتالیک*‌ یا __ایتالیک__
  • **ضخیم** یا __ضخیم__
  • آدرس:[متن](http://url.com/ "عنوان")
  • عکس?![alt متن](/path/img.jpg "عنوان")
  • لیست عددی: 1. Foo 2. Bar
  • برای رفتن به خط بعد، هر جا مایلید که خط جدید شروع شود دو کاراکتر فاصله (space) قرار دهید
  • تگ‌های ساده HTML هم پشتیبانی می‌شوند

تگها:
  • ×137
  • ×54
  • ×40
  • پرسیده شده: 06 ژانویه '12, 15:50
  • بازدید: 3,008 بار
  • آخرین بروزرسانی: 04 ژانویه '13, 07:48

این سوال را دنبال کنیدتوسط ایمیل: ایمیل شما (باید معتبر باشد, هرگز به دیگران نمایش داده نمیشود):

هنگامی که شما به سیستم وارد شوید،قادر خواهید بود برای بروز رسانی ها مشترک شوید.


توسط RSS:

پاسخها

پاسخها و نظرها