Простой мигающий текст - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь собрать простой демонстрационный проект с мигающим текстом «Hello World» с наименьшим возможным кодом в C # / WPF.То, что я написал, компилируется и запускается, но на самом деле текст не мигает (он основан на таймере, который срабатывает каждые 2 секунды и меняет видимость метки. Любые мысли о том, почему текст не мигает или что более эффективноподход будет? Код:

using System;
using System.Timers;
using System.Windows;

namespace BlinkingText
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        static Timer _timer;
        static MainWindow window = new MainWindow();

    public MainWindow()
    {
        InitializeComponent();

        Start();
    }

    public static void Start()
    {
        var timer = new Timer(2000);
        timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
        timer.Enabled = true;
        _timer = timer;
    }

    public static void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {

        if (window.HelloWorldLabel.Visibility == Visibility.Hidden)
        {
            Application.Current.Dispatcher.Invoke((Action)delegate
            {
                window.HelloWorldLabel.Visibility = Visibility.Visible;
            });
        }
        else
        {
            Application.Current.Dispatcher.Invoke((Action)delegate
            {
                window.HelloWorldLabel.Visibility = Visibility.Hidden;
            });
      }
    }
  }
}

1 Ответ

6 голосов
/ 18 июня 2019

Текст в вашем приложении не мигает, потому что вы изменяете Видимость метки в скрытом экземпляре MainWindow, который не идентичен тому, который вы видите на экране.

Создано

static MainWindow window = new MainWindow();

но никогда не показывается.

Кроме того, вы должны использовать DispatcherTimer следующим образом:

public partial class MainWindow : Window
{
    private readonly DispatcherTimer timer =
        new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };

    public MainWindow()
    {
        InitializeComponent();

        timer.Tick += Timer_Tick;
        timer.Start();
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        HelloWorldLabel.Visibility = HelloWorldLabel.Visibility == Visibility.Visible
            ? Visibility.Hidden : Visibility.Visible;
    }
}

Вы также можете сделать нечто подобное полностью в XAML, например, как это:

<TextBlock Text="Hello, World.">
    <TextBlock.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames
                        Storyboard.TargetProperty="Visibility"
                        Duration="0:0:4" RepeatBehavior="Forever">

                        <DiscreteObjectKeyFrame
                            KeyTime="0:0:0"
                            Value="{x:Static Visibility.Visible}"/>
                        <DiscreteObjectKeyFrame
                            KeyTime="0:0:2"
                            Value="{x:Static Visibility.Hidden}"/>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </TextBlock.Triggers>
</TextBlock>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...