Vánoční nadílka Vánoční nadílka
Až 80% zdarma! Předvánoční BLACK FRIDAY akce. Více informací

Diskuze: WPF animace blokující přístup k vlastnosti

C# .NET .NET (C# a Visual Basic) WPF animace blokující přístup k vlastnosti American English version English version

Aktivity (3)
Avatar
Tomáš Vitek:27. července 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. července 14:05
Avatar
Bruno Schwarzbach:27. července 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. července 15:08
 
Nahoru Odpovědět 27. července 15:06
Avatar
Odpovídá na Bruno Schwarzbach
Tomáš Vitek:27. července 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. července 17:24
Avatar
Bruno Schwarzbach:27. července 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. července 18:17
Avatar
Odpovídá na Bruno Schwarzbach
Tomáš Vitek:28. července 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. července 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.