WPF האנימציה לא מפסיקה אף שהפקד מוסתר
-
ראו בקוד הבא שהלחצן מסתובב תמיד וגם כאשר הוא נסתר המעלות שלו ממשיכות להשתנות, השאלה איך אפשר למנוע את זה, הרי אם הפקד לא נראה זה סתם בזבוז משאבים שהוא ממשיך להסתובב.
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Animations In XAML" Height="180" Width="300" > <Window.Resources> <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter1" /> </Window.Resources> <Grid> <Button Name="btnSend" Width="100" Visibility="{Binding ElementName=CheckBox1, Converter={StaticResource BooleanToVisibilityConverter1}, Path=IsChecked}" Height="40" Margin="40" Background="Plum"> <Button.RenderTransform> <RotateTransform Angle="0" CenterX="50" CenterY="20" /> </Button.RenderTransform> <Button.Style> <Style TargetType="Button"> <Style.Triggers> <Trigger Property="Visibility" Value="Visible"> <Trigger.EnterActions> <BeginStoryboard> <Storyboard Storyboard.TargetProperty="(RenderTransform).(RotateTransform.Angle)"> <DoubleAnimation From="0" To="360" Duration="0:0:5" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard> </Trigger.EnterActions> </Trigger> </Style.Triggers> </Style> </Button.Style> פורום חרדי מיקצועי </Button> <CheckBox Content="הצג/הסתר" IsChecked="True" Height="16" Name="CheckBox1" /> <Label Content="{Binding Path=RenderTransform.Angle, ElementName=btnSend}" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="Label1" VerticalAlignment="Top" /> <Label Content="מעלות" Height="28" HorizontalAlignment="Left" Margin="192,12,0,0" Name="Label2" VerticalAlignment="Top" /> </Grid> </Window>
תודה לכולם.
וחודש אדר שמח!פורסם במקור בפורום CODE613 ב06/03/2014 20:30 (+02:00)
-
לא בטוח שזה ביזבוז משאבים.
אל תשכח שהCLR הוא טיפש (אל תכעס...) הוא לא יודע אם זה אנימציה, או שזה משהו שאמור לטפל במשהו אחר מאחורי הקלעים.
דבר נוסף, נגיד שהCLR כן יודע שזה אנימציה, למה שהוא יעצור לך אותה? אולי זו אנימציה שרצה כל שעה סיבוב שלם? ואם זה יהיה מוסתר ל5 דקות יהיה חסר 5 דקות בשעה?במאמר המוסגר, מספרים שבMacOs של אפל התצוגה של החלונות מאחורה לא מתעדכנת אם החלון לא פעיל. (לא בדקתי את זה) - זה יכול להיות נחמד וחוסך משאבים, רק שאני מנסה לתאר לעצמי את הסיטואציה הבאה:
אני מוריד קובץ של 600 מ"ב מהאינטרנט, ועד שתסתיים ההורדה אני כותב לי להנאתי משהו בVS, אני יכול להקטין קצת את החלון ולעקוב בינתיים מה קורה למטה בצד ימין בכרום. (נא לא לצעוק לי איך אפשר אפשר לפתור את זה ושזה ייפתח בסיום ההורדה וכו' - זה רק לצורך המחשת הדוגמא) - עכשיו, תאר לך שהחלון הלא פעיל לא מעדכן את התצוגה שלו מטעמי חיסכון, איך אני ידע שנגמרה ההורדה?והנלע"ד שאם אתה רוצה שהאנימציה תיעצר, אין לך ברירה אלא לעצור אותה בעצמך.
פורסם במקור בפורום CODE613 ב06/03/2014 21:08 (+02:00)
-
בשביל זה יש ExitAction.
<Trigger.EnterActions> <BeginStoryboard x:Name="story"> <Storyboard Storyboard.TargetProperty="(RenderTransform).(RotateTransform.Angle)"> <DoubleAnimation From="0" To="360" Duration="0:0:5" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard> </Trigger.EnterActions> <Trigger.ExitActions> <StopStoryboard BeginStoryboardName="story" /> </Trigger.ExitActions>
זה בקשר לעצירת אנימציה בWPF. בקשר לביצועים אני ממש לא יודע, וכמו ClickOne אני לא בטוח שזה מבזבז משהו, זה סה"כ עוד טיימר במחשב שיש בו הרבה.
אבל מה שהוא כתב שהמערכת לא יכולה לדעת, זה לא נכון, אפשר לדעת כל חלון אם הוא חשוף למשתמש, ומי שדואג לצייר אותו בהכרח עושה זאת בגלל שהוא יודע.
חלון שלא מוצג בהכרח צורך פחות משאבים, לפחות מהמעבד הגרפי (בו WPF משתמשת!).
בקשר לחישובים מסביב לתצוגה שאינם בהכרח מיותרים כשהתצוגה לא פעילה זה באמת נושא, ומתי שזה משמעותי יש למצוא פיתרון.פורסם במקור בפורום CODE613 ב06/03/2014 22:04 (+02:00)
-
@דוד ל.ט.
אבל מה שהוא כתב שהמערכת לא יכולה לדעת, זה לא נכון, אפשר לדעת כל חלון אם הוא חשוף למשתמש, ומי שדואג לצייר אותו בהכרח עושה זאת בגלל שהוא יודע.
חלון שלא מוצג בהכרח צורך פחות משאבים, לפחות מהמעבד הגרפי (בו WPF משתמשת!).אל תשכח שהCLR הוא טיפש (אל תכעס...) הוא לא יודע אם זה אנימציה, או שזה משהו שאמור לטפל במשהו אחר מאחורי הקלעים.
לא כתבתי שהCLR לא יודע אם זה מוצג או לא. (ברור שהוא יודע)אלא התכוונתי שהCLR לא יודע האם זה משמעותי לעצור את האנימציה לאותו זמן שהאובייקט מוסתר.
נניח שיש תמונת GIF שמחזור החיים שלה הוא שעה ומה שיש שם זה תמונה עם קו שמסתובב וסוגר עיגול במשך שעה.
אז אם הוא יעצור את זה כשזה יהיה מוסתר, כשהאנימציה תמשיך, היא "תפספס" את זמן העצירה ולזה התכוונתי.
דיי ברור לי שהCLR לא "טוחן" את המעבד הגרפי בזמן שהאנימציה מוסתרת, אפילו אם היא ממשיכה לרוץ באותו רגע. זה 2 דברים נפרדים לחלוטין.פורסם במקור בפורום CODE613 ב06/03/2014 22:53 (+02:00)