C# 定时器为';t在WPF工作

C# 定时器为';t在WPF工作,c#,wpf,C#,Wpf,伙计们,我正在尝试使用Dispatchermer运行ProgressBar。我创建了一个事件“Timer_Tick”,并更改了progressbar的值。但它不起作用。我是WPF的新手,请帮助我解决这个问题。:) XAML代码: <Window x:Name="Form1" x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation

伙计们,我正在尝试使用Dispatchermer运行ProgressBar。我创建了一个事件“Timer_Tick”,并更改了progressbar的值。但它不起作用。我是WPF的新手,请帮助我解决这个问题。:)

XAML代码:

<Window x:Name="Form1" x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="800" Loaded="Form1_Loaded">
    <Grid Background="#FF070B34">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="395*"/>
            <ColumnDefinition Width="298*"/>
            <ColumnDefinition Width="99*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="308*"/>
            <RowDefinition Height="261*"/>
        </Grid.RowDefinitions>
        <TextBlock Height="41" Margin="190,31,93.015,0" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="24" FontFamily="Times New Roman" Foreground="#FF4C5FD8" Grid.ColumnSpan="2">
            <TextBlock.Effect>
                <DropShadowEffect Color="#FF8A83D3" RenderingBias="Quality" ShadowDepth="0"/>
            </TextBlock.Effect><Run Language="en-gb" Text="WELCOME TO E-VOTING MACHINE"/></TextBlock>
        <Image Source="C:\Users\Hussam\Documents\Visual Studio 2013\Projects\WpfApplication1\WpfApplication1\bin\Debug\emachine.jpg" Margin="64,0,64,87" Grid.RowSpan="2" Grid.ColumnSpan="3" Height="393" VerticalAlignment="Bottom" >
            <Image.OpacityMask>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Black" Offset="0"/>
                    <GradientStop Color="White" Offset="1"/>
                </LinearGradientBrush>
            </Image.OpacityMask>
        </Image>
        <ProgressBar x:Name="progressBar1" HorizontalAlignment="Left" Value="0" Minimum="0" Height="27" Margin="140,200,0,0" VerticalAlignment="Top" Width="512" Grid.Row="1" Grid.ColumnSpan="2"/>

    </Grid>
</Window>

尝试将以下语句A放在计时器功能的末尾

CommandManager.InvalidateRequerySuggested();

阅读这篇MSDN文章,它解释了你需要的一切

最好使用System.Timer.Timer而不是dispatch Timer。此外,计时器在不同的线程上运行,因此UI更新必须通过委托完成

public partial class MainWindow : Window
    {
        private System.Timers.Timer _timer;
        private int count = 0;

        public MainWindow()
        {
            InitializeComponent();

            _timer = new Timer(1000);
            _timer.Elapsed += _timer_Elapsed;
            _timer.Enabled = true;
            _timer.Start();
        }

        void _timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            this.Dispatcher.Invoke(UpdateProgressBar);
        }

        private void UpdateProgressBar()
        {
            progressBar1.Value = count;
            count++;
        }
    }

你的代码没问题。我可以在我的机器上运行它。
它每10秒滴答响一次。我不知道为什么它不能在您的机器上工作。

您需要Dispatcher,我认为新版本的.net也有Dispatcher类。当您从其他线程更新主线程时,您需要通过dispatcher进行更新


到底是什么不起作用?你能说得更具体一点吗?ProgressBar应该随着计时器的滴答声改变它的值,但它不会改变值。ProgressBar未运行。请参阅下面的答案,调度计时器是System.Threading程序集的一部分。它将在调度程序队列的末尾执行计时器计时,而不是在给定的时间段。因此,在调度程序队列获得优先级之前,您可能无法获得计时器计时。此外,UI更新应该在主线程中,而不是在计时器线程中。同时发布您的XAML。如果您没有在窗口上连接已加载的事件,那么将无法工作,因为您正在从Form1\u Loded method.dispatcherTimer.Tick+=new EventHandler(dispatcherTimer\u Tick)启动所有内容;谢谢,它正在处理TimeSpan的另一个重载构造函数。我不知道为什么,但它起作用了。
public partial class MainWindow : Window
    {
        private System.Timers.Timer _timer;
        private int count = 0;

        public MainWindow()
        {
            InitializeComponent();

            _timer = new Timer(1000);
            _timer.Elapsed += _timer_Elapsed;
            _timer.Enabled = true;
            _timer.Start();
        }

        void _timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            this.Dispatcher.Invoke(UpdateProgressBar);
        }

        private void UpdateProgressBar()
        {
            progressBar1.Value = count;
            count++;
        }
    }