C# týden C# týden
AKCE! Rozšiřujeme naši individuální výuku programování! Čemukoli nerozumíš, nejde ti něco odevzdat? Poradit.
Pouze tento týden sleva až 80 % na C# .NET
Avatar
Tomáš Vitek:27.7.2018 14:05

Ahoj,
mám následující probém: Udělal jsem animaci pro grid, která mu postupně snižuje průhlednost a nakonec ho zneviditelní:

private void HideGrid(Grid grid)
        {
            // Initialize storyboard for animations
            Storyboard hideStoryboard = new Storyboard();
            // Set opacity to 0 animation
            DoubleAnimation opacityAnimation = new DoubleAnimation(0, new Duration(TimeSpan.FromMilliseconds(OpacityAnimationLenght)));
            Storyboard.SetTargetName(opacityAnimation, grid.Name);
            Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath(OpacityProperty));
            hideStoryboard.Children.Add(opacityAnimation);

            ObjectAnimationUsingKeyFrames visibilityAnimation = new ObjectAnimationUsingKeyFrames();
            DiscreteObjectKeyFrame visibilityKeyFrame = new DiscreteObjectKeyFrame(Visibility.Hidden,KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(OpacityAnimationLenght)));
            visibilityAnimation.KeyFrames.Add(visibilityKeyFrame);
            visibilityAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(OpacityAnimationLenght));
            Storyboard.SetTargetName(visibilityAnimation, grid.Name);
            Storyboard.SetTargetProperty(visibilityAnimation, new PropertyPath(Grid.VisibilityProperty));
            hideStoryboard.Children.Add(visibilityAnimation);

            hideStoryboard.Begin(this);

            grid.Visibility = Visibility.Hidden;
        }

Když se pak ale pokouším stejný grid znovu zviditelnit, vlastnost Visibility se jednoduše nezmění a zůstane pořád nastavená na Hidden. Nevíte někdo, co s tím?

Zkusil jsem: Zkoušel jsem celou tu animaci vymazat a potom to opravdu funguje tak, jak má, takže to musí být tím. Já bych tam tu animaci ale rád měl :)

Chci docílit: Vytvoření znovupoužitelné fade in/out animace pro grid.

 
Odpovědět 27.7.2018 14:05
Avatar
Bruno Schwarzbach:27.7.2018 15:06

Nevím, co přesně, co je účelem té animace, ale šlo by to i tak, že animuješ barvu pozadí gridu z nějaké barvy do transparentní barvy, po skončení animace nastavíš zpět původní barvu:

public partial class MainWindow : Window
   {
       ColorAnimation ca = new ColorAnimation(Color.FromRgb(255, 0, 0), Colors.Transparent, TimeSpan.FromSeconds(2));
       DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(2) };
       SolidColorBrush brush;
       public MainWindow()
       {
           InitializeComponent();
       }

       private void MainGrid_Loaded(object sender, RoutedEventArgs e)
       {
           brush = new SolidColorBrush(Color.FromRgb(255, 0, 0));
           MainGrid.Background = brush;
           brush.BeginAnimation(SolidColorBrush.ColorProperty, ca);
           timer.Tick += Timer_Tick;
           timer.Start();
       }

       private void Timer_Tick(object sender, EventArgs e)
       {
           timer.Stop();
           brush.BeginAnimation(SolidColorBrush.ColorProperty, null);
           brush.Color = Color.FromRgb(255, 0, 0);
       }
   }

Pokud jsem tvůj problém nepochopil správně, omlouvám se...

Editováno 27.7.2018 15:08
 
Nahoru Odpovědět 27.7.2018 15:06
Avatar
Odpovídá na Bruno Schwarzbach
Tomáš Vitek:27.7.2018 17:24

Obávám se, že to bohužel není to, co potřebuji.
Mám totiž dva navzájem se překrývající gridy, mezi kterými chci plynule (pomocí animace) přecházet. Jsou na nich elementy, takže nemůžu použít background, a jelikož nechci, aby na ně po konci aplikace šlo klikat či jinak s nimi interagovat, nestačí mi ani samotná opacity, ale na konci animace musím změnit Visibility na Hidden nebo Collapsed.

(Nespíš bych na to mohl vytvořit samostatné vlákno, které by po dobu animace bylo uspané, a potom by viditelnost pomocí Invoku přepnulo, ale to nezní jako zrovna elegantní řešení ...)

 
Nahoru Odpovědět 27.7.2018 17:24
Avatar
Bruno Schwarzbach:27.7.2018 18:17

A co tedy tohle:

public partial class MainWindow : Window
   {
       DoubleAnimation da = new DoubleAnimation(1, 0, TimeSpan.FromSeconds(2));
       DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(2) };
       SolidColorBrush brush;
       public MainWindow()
       {
           InitializeComponent();
       }

       private void MainGrid_Loaded(object sender, RoutedEventArgs e)
       {
           MainGrid.BeginAnimation(Grid.OpacityProperty, da);
           timer.Tick += Timer_Tick;
           timer.Start();
       }

       private void Timer_Tick(object sender, EventArgs e)
       {
           timer.Stop();
           MainGrid.BeginAnimation(Grid.OpacityProperty, null);
           MainGrid.Opacity = 1;
       }
   }

Tu změnu viditelnosti jsem stále nepochopil, ale na konci animace v rámci Timer_Tick si nastav co chceš.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 27.7.2018 18:17
Avatar
Odpovídá na Bruno Schwarzbach
Tomáš Vitek:28.7.2018 19:37

Tu změnu viditelnost potřebuji, protože i když je opacity nastavená na 0, na elementy jde klikat, i když nejsou viditelné. Nicméně můj problém to řeší, netušil jsem, že takhle jde vypnout animaci a uvolnit tak tu vlastnost:

MainGrid.BeginAnimation(Grid.VisibilityProperty, null);

Díky za pomoc.

 
Nahoru Odpovědět 28.7.2018 19:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.