Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: zemla 30. 03. 2019, 23:44:52

Název: WPF pokus o raisnutí EventTrigerru z kódu a StackOverflowException
Přispěvatel: zemla 30. 03. 2019, 23:44:52
Ahoj,

potřeboval bych prosím docela pomoct, protože už jsem vyčerpal všechny své pokusy/omyly, co mě napadly.

Kvůli animaci jsem si odvodil z TextBlocku vlastní CustomTextBlock, není na něm nic moc zvláštního, ale vypadá takhle:

Kód: [Vybrat]
    public class CustomTextBlock : TextBlock
    {
        public static readonly RoutedEvent ShowTextEvent =
            EventManager.RegisterRoutedEvent("ShowText", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CustomTextBlock));

        public event RoutedEventHandler ShowText
        {
            add
            {
                this.AddHandler(ShowTextEvent, value);
            }

            remove
            {
                this.RemoveHandler(ShowTextEvent, value);
            }
        }
    }

v XAMLu mám potom:

Kód: [Vybrat]
        <local:CustomTextBlock x:Name="InfoTextBlock" Text="{Binding InfoTextBlockText, Mode=TwoWay}" Width="411" Height="54" FontSize="36" FontWeight="Normal" Canvas.Left="258" Canvas.Top="265">
            <local:CustomTextBlock.Foreground>
                <SolidColorBrush x:Name="InfoSolidColorBrush" Color="Transparent" />
            </local:CustomTextBlock.Foreground>
            <local:CustomTextBlock.Triggers>
                <EventTrigger RoutedEvent="local:CustomTextBlock.ShowText">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation Storyboard.TargetName="InfoSolidColorBrush" Storyboard.TargetProperty="Color" From="GreenYellow" To="Transparent" Duration="0:0:3"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </local:CustomTextBlock.Triggers>
        </local:CustomTextBlock>

Je tam trigger, protože tu animaci potřebují zavolat z kódu, ovšem z View na základě co mi na převolání ViewModel vrátí.

A volám to takto:

Kód: [Vybrat]
InfoTextBlock.RaiseEvent(new RoutedEventArgs(CustomTextBlock.ShowTextEvent, this));

Je mi jasné, že když přeteče zásobník, musím tam mít někde cyklickou závislost, jenže ji nevídím.

Proto jsem chtěl poprosit, jestli by se na to někdo z vás mohl podívat svýma očima, třeba je to něco triviálního.

Byl bych vám za to moc vděčný.
Díky za případnou radu.
Název: Re:WPF pokus o raisnutí EventTrigerru z kódu a StackOverflowException
Přispěvatel: zemla 13. 04. 2019, 19:27:45
Odpověď se nakonec našla:

1. Pokud se to volá z View, stačí zavolat Begin na Storyboard.

2. Pokud z View Modelu, tak na ThreadPoolu zavolat Dispatcher.BeginInvoke...

Snad to pomůže ostatním.

Jappa :-)