在我的WPF应用程序,我必须表现出与在计时器滴答事件,对此我下面写一个进度的进展,
System.Windows.Forms.Timer timer;
public MainWindow()
{
timer = new System.Windows.Forms.Timer();
timer.Interval = 1000;
this.timer.Tick += new System.EventHandler(this.timer_Tick);
}
如下面加载事件
private void Window_Loaded(object sender, RoutedEventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Value = DateTime.Now.Second;
progressBar1.Maximum = 700;
timer.Start();
}
而在最后的Tick事件,
private void timer_Tick(object sender, EventArgs e)
{
Duration duration = new Duration(TimeSpan.FromSeconds(20));
//progress bar animation
System.Windows.Media.Animation.DoubleAnimation doubleanimation = new System.Windows.Media.Animation.DoubleAnimation(200.0, duration);
progressBar1.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
}
当我执行我的计划进度显示,二,三棒的进展,然后停止增量。 后来有在进步没有任何影响。 出了什么问题在我的代码。 请帮忙!..
问候桑杰塔
在我的WPF应用程序我有... System.Windows.Forms.Timer timer;
这是错误的类型的定时器。 使用DispatcherTimer代替。
当我执行我的计划进度显示,二,三棒的进展,然后停止
这让我吃惊,我怎么也没有想到它在所有的工作。 这意味着你可能有oher问题太像阻塞主(调度)线程。
你只设定值一次,在加载的事件:
progressBar1.Value = DateTime.Now.Second;
还有就是没有变化progressBar1.Value
在Tick事件。 所以它的数字,它停止移动。
由于你的ProgressBar
并不涉及任何特定的行为,它看起来像一个不确定栏的工作。
这其他的SO问题提供了一些关于它的洞察力。 总之,这是一个XAML一行代码:
<!-- MinVal, MaxVal, Height needed for this to work -->
<ProgressBar x:Name="progressBar1" Margin="5" IsIndeterminate="True"
MinimumValue="0" MaximumValue="700" value="0" Height="20"/>
然后在代码中,你是这样的:
progressBar1.IsIndeterminate = true; // start animation
progressBar1.IsIndeterminate = false; // stop animation
使用DispatcherTimer代替定时器(窗体对象),以及进度条的使用Value属性。
试试这个 :
MainWindows.xaml:
<Window 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="55" Width="261">
<Grid>
<ProgressBar Name="pb" Maximum="60" />
</Grid>
</Window>
MainWindows.xaml.cs:
using System.Windows;
using System.Windows.Threading;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
private DispatcherTimer timer;
public MainWindow()
{
InitializeComponent();
this.timer = new DispatcherTimer();
this.timer.Tick += timer_Tick;
this.timer.Interval = new System.TimeSpan(0, 0, 1);
this.timer.Start();
}
private void timer_Tick(object sender, System.EventArgs e)
{
this.pb.Value = System.DateTime.Now.Second % 100;
}
}
}
您可以通过更改Value属性(别忘了最大属性定义在XAML)更改进度条的行为。
我发现这个( WPF多线程:使用BackgroundWorker和报告的UI链接进展。 )包含我需要一个很好的解决方案,尽管有一个对话框。
有一两件事,我发现非常有用的是,使用主窗口的事件处理程序,有可能里面的委托时,工作线程无法访问主窗口的控制(在它自己的方法),但是。
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
pd.Close();
// Get a result from the asynchronous worker
T t = (t)args.Result
this.ExampleControl.Text = t.BlaBla;
};