WPF, efekt "marquee" i szerokość tekstu w TextBlock

0

Witajcie,

chciałam uzyskać efekt przesuwanego tekstu - "marquee".
Kod, który mam to:

<Canvas>
    <TextBlock Name="TextBlockMarquee" Text="Przykładowy tekst" FontSize="72" Foreground="#FFFFFFFF" />
</Canvas>

oraz

var doubleAnimation = new DoubleAnimation
{
    From = this.ActualWidth,
    To = -TextBlockMarquee.ActualWidth,
    RepeatBehavior = RepeatBehavior.Forever,
    Duration = new Duration(TimeSpan.FromSeconds(40))
};
TextBlockMarquee.BeginAnimation(Canvas.LeftProperty, doubleAnimation);     

Działa prawidłowo, czyli tekst wysuwa się z prawej strony i przesuwa do lewej gdzie się chowa.

Chciałabym jednak zmieniać tekst w trakcie działania programu. Usunęłam Text="Przykładowy tekst" w XAML i dodałam do kodu

marquee.Text = "Nowy przykładowy tekst";

...i niestety przestało działać. Tekst zamiast chować się z lewej strony to znika jak tylko dotknie krawędzi ekranu.
Domyślam się, że to przez -TextBlockMarquee.ActualWidth, który wynosi w tej chwili 0 (wiem, bo wyświetliłam tę wartość w pomocniczym TextBlock).
Kiedy tekst jest umieszczony w kodzie XAML to szerokość jest prawidłowo podawana.

Tak więc moje pytanie brzmi - jak to przerobić, żeby działało? Jak obliczyć tę szerokość tekstu w TextBlock jeżeli tekst nie jest podany w XAML a w kodzie c#?

0

nie napisałaś gdzie umieściłaś kod animacji, chodzi mi o kod c# (kontrolka/zdarzenie) i jak Canvas umieściłaś; poniżej zamieszczam przykładowy kod, może będzie pomocny

<Canvas>
    <TextBlock Name="TextBlockMarquee" FontSize="72" />
    <TextBox Name="text1" Margin="5 150" Width="200" Height="30" TextChanged="text1_TextChanged"  />
</Canvas>

code-behind

void marq()
{    
   var doubleAnimation = new DoubleAnimation
   {
        From = this.ActualWidth,
        To = -TextBlockMarquee.ActualWidth,
        RepeatBehavior = RepeatBehavior.Forever,
        Duration = new Duration(TimeSpan.FromSeconds(40))
    };

    TextBlockMarquee.BeginAnimation(Canvas.LeftProperty, doubleAnimation);               
}

private void text1_TextChanged(object sender, TextChangedEventArgs e)
{
     TextBlockMarquee.Text = text1.Text;
     marq();
}

Czy Ty używasz czarnego tła?

1 użytkowników online, w tym zalogowanych: 0, gości: 1