C#要设置动画的不确定进度条
我对C#WPF还相当陌生,在我的主代码继续运行时,我需要帮助尝试让我的不确定进度条动画化。我已经研究并尝试了很多不同的线程方法和后台工作人员等等…但似乎没有任何效果。下面的代码是我见过的最接近的代码,我可以看到进度条开始动画化,我的主代码继续运行,但是我得到了一个异常“调用线程无法访问这个对象,因为它是另一个线程拥有的。”我非常感谢任何关于如何实现这一点的见解C#要设置动画的不确定进度条,c#,wpf,multithreading,asynchronous,progress-bar,C#,Wpf,Multithreading,Asynchronous,Progress Bar,我对C#WPF还相当陌生,在我的主代码继续运行时,我需要帮助尝试让我的不确定进度条动画化。我已经研究并尝试了很多不同的线程方法和后台工作人员等等…但似乎没有任何效果。下面的代码是我见过的最接近的代码,我可以看到进度条开始动画化,我的主代码继续运行,但是我得到了一个异常“调用线程无法访问这个对象,因为它是另一个线程拥有的。”我非常感谢任何关于如何实现这一点的见解 public partial class MainWindow : Window { public MainWindow()
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
[STAThread]
private async void cmsServerConnect(object sender, RoutedEventArgs e)
{
Login form = new Login();
form.ShowDialog();
if (form.cancelClicked == true && form.enter_Pressed == false)
{
return;
}
//Create new thread to have indeterminate progress bar run on
//Set new thread appartmentstate to STA
//Start thread
Connect_Progress progress = new Connect_Progress();
Thread t = new Thread(() => progress.Show());
t.SetApartmentState(ApartmentState.STA);
t.Start();
//Using async at method declaration
//await is allowing the UI to continue updating while running the task connection.cmsConnect()
Ribbon_Buttons connection = new Ribbon_Buttons();
int connected = await Task.Run(() => connection.cmsConnect(form.id, form.Pword));
if (connected == 2)
{
BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri("pack://application:,,,/Images/Circle_Green.png");
image.EndInit();
this.Ribbon_Button_ACM12_Connection.SmallImageSource = image;
this.Ribbon_Button_ACM12_Connection.Label = "Connected";
}
t.Abort();
this.Activate();
this.Topmost = true;
this.Topmost = false;
this.Focus();
}
您应该使用后台工作程序 xaml
c#
private readonly BackgroundWorker worker=new BackgroundWorker();
公共主窗口()
{
初始化组件();
worker.DoWork+=worker\u DoWork;
worker.RunWorkerCompleted+=worker\u RunWorkerCompleted;
}
私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
{
对于(int i=0;i<100;i++)
{
Dispatcher.BeginInvoke((操作)(()=>
{
myProgressBar.Value=i;
}));
睡眠(100);
}
}
私有void worker\u RunWorkerCompleted(对象发送方,
RunWorkerCompletedEventArgs(e)
{
myProgressBar.Value=100;
}
私有无效myButton_单击(对象发送方,路由目标)
{
worker.RunWorkerAsync();
}
}
为什么使用STAThread
属性?我一直得到一个例外,运行进度条的线程必须是STA,我在网上找到的一个修复方法是将该属性设置在方法之上……然而,它从未奏效,我没有意识到它仍然存在。这是什么功能区按钮?你到底从哪里得到了例外?我猜它在Ribbon\u Buttons
行上,对吗?Ribbon\u Buttons只是我制作的一个类,它包含了我功能区上所有按钮的代码。异常是在“Thread t=new Thread(()=>progress.Show());”行中抛出的,带有wait的功能区按钮部分实际上开始正常运行。。。
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ProgressBar x:Name="myProgressBar" Width="400" Grid.Row="0" Height="30" />
<Button x:Name="myButton" Width="200" Height="30" Grid.Row="1" Click="myButton_Click" Content="Click Me" />
</Grid>
private readonly BackgroundWorker worker = new BackgroundWorker();
public MainWindow()
{
InitializeComponent();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
Dispatcher.BeginInvoke((Action)(() =>
{
myProgressBar.Value = i;
}));
Thread.Sleep(100);
}
}
private void worker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
myProgressBar.Value = 100;
}
private void myButton_Click(object sender, RoutedEventArgs e)
{
worker.RunWorkerAsync();
}
}