C# 定时器为';t在WPF工作
伙计们,我正在尝试使用Dispatchermer运行ProgressBar。我创建了一个事件“Timer_Tick”,并更改了progressbar的值。但它不起作用。我是WPF的新手,请帮助我解决这个问题。:) XAML代码: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
<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++;
}
}