Отображение метки в течение 3/5 секунд в wpf С#, но после некоторого щелчка она не остается дольше

Я пытаюсь показать текст в метке в wpf при нажатии кнопки, а затем скрыть через пару секунд. Я знаю, что есть ответы на этот вопрос, но моя проблема в другом.

Я использовал эти 2 способа скрытия метки:

Один

   //When the button is pressed
   label_plus.Visibility = System.Windows.Visibility.Visible;

   DispatcherTimer timer = new DispatcherTimer();
   timer.Interval = new TimeSpan(0, 0, 5);
   timer.Tick += timer_Tick;                //Or, timer.Tick += new EventHandler(timer_Tick);
   timer.Start();

// The timer event handler
void timer_Tick(object sender, EventArgs e)
        {
            label_plus.Visibility = System.Windows.Visibility.Collapsed;
}

Два

   //Button pressed
   label_plus.Content = label_plus1.Content = "+";
   DispatcherTimer timer = new DispatcherTimer();
   timer.Interval = new TimeSpan(0, 0, 5);
   timer.Tick += (o, args) => label_plus.Content = "";
   timer.Start();

Примечание. Второй почти такой же, за исключением строки «timer.tick += (o, args)». Я получил этот код из: Здесь. Это был код приложения Form, поэтому я просто попробовал эту часть, и она сработала.

Первый код я получил непосредственно из здесь.

Проблема в том, что и в первый, и во второй раз это работает довольно хорошо. И, возможно, в третий раз. Но после этого я чувствую, что секунда таймера уменьшается. После 2/3 раз он прячется в течение 3/4 секунд, после чего едва остается на 1 секунду или меньше.

Есть ли лучший способ сделать это или избавиться от этой проблемы? Я новичок в Visual Studio.

Обновление: Это тоже хорошо работает, но постоянно повторяется. Любой способ остановиться после одного процесса?

var timer = new System.Timers.Timer();

            timer.Elapsed += timer_Tick;
            timer.Interval = 3000;
            timer.Enabled = true;
            timer.Start();

void timer_Tick(object sender, EventArgs e)
        {
            //label_plus.Visibility = label_plus1.Visibility = System.Windows.Visibility.Collapsed; 
            MessageBox.Show("Show some data");

        }

Заранее спасибо.


person Community    schedule 01.06.2015    source источник
comment
Как вы заметили, проблема в том, что таймер является периодическим. Попробуйте ((Timer)sender).Enabled = false; в обработчике. Кроме того, попробуйте создать только один таймер и сохранить его, вместо того, чтобы создавать новые таймеры каждый раз, когда вы хотите отображать короткую продолжительность.   -  person Ben Voigt    schedule 02.06.2015
comment
Спасибо, тоже получилось.   -  person    schedule 02.06.2015


Ответы (3)


Это работает:

XAML:

<StackPanel>
    <Button Width="50"
            Height="50"
            Click="Button_Click"
            Content="OK" />
    <Label x:Name="MyLabel"
            Content="THIS IS A LABEL"
            FontSize="30"
            Visibility="Collapsed" />
</StackPanel>

Код программной части:

private DispatcherTimer dispatcherTimer;

public MainWindow()
{
    InitializeComponent();

    //Create a timer with interval of 2 secs
    dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    //Things which happen before the timer starts
    MyLabel.Visibility = System.Windows.Visibility.Visible;

    //Start the timer
    dispatcherTimer.Start(); 
}

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    //Things which happen after 1 timer interval
    MessageBox.Show("Show some data");
    MyLabel.Visibility = System.Windows.Visibility.Collapsed;

    //Disable the timer
    dispatcherTimer.IsEnabled = false;
}
person goobering    schedule 01.06.2015
comment
Спасибо, это сработало. И объяснение было также полезно. - person ; 02.06.2015
comment
Кстати, мне пришлось поставить частный DispatcherTimer dispatcherTimer; после главного окна, иначе не работает. - person ; 09.06.2015
comment
У меня есть эта строка после объявления класса (открытый частичный класс MainWindow : Window), но до конструктора, показанного выше. Это должна быть глобальная переменная, поэтому вы не можете поместить ее внутрь метода. - person goobering; 09.06.2015

При нажатии на кнопку будет отображаться метка «Ошибка» в течение 3 секунд, и метка исчезнет через 3 секунды.

XAML

<Window.Resources>
    <Storyboard x:Key="sbHideAnimation" >
        <DoubleAnimation Storyboard.TargetProperty="Opacity"  From="1" To="1" Duration="0:0:3" /><!--label shows for 3 sec-->
        <DoubleAnimation Storyboard.TargetProperty="Opacity" BeginTime="0:0:3" From="1" To="0" DecelerationRatio=".5" Duration="0:0:2" /><!--Fade out the label after 3 sec-->
    </Storyboard>
</Window.Resources>
<Grid>
    <Label x:Name="lblError" Content="Error" FontSize="20" HorizontalAlignment="Center" Opacity="0"/>
    <Button Click="Button_Click" Content="Button" VerticalAlignment="Center" Width="100" />
</Grid>

Code behind(c#)

using System.Windows;
using System.Windows.Media.Animation;

namespace WpfApplication1
{    
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {           
            Storyboard sb = Resources["sbHideAnimation"] as Storyboard;
            sb.Begin(lblError);
        }
    }
}

Вы можете настроить продолжительность отображения метки, изменив значение атрибутов «BeginTime» и «Duration» в раскадровке «sbHideAnimation».

Вывод введите здесь описание изображения

person Deepu Reghunath    schedule 16.08.2017