c# XAML在BackGroundWorker中创建StackPanel
本文关键字:创建 StackPanel BackGroundWorker XAML | 更新日期: 2023-09-27 18:13:30
这是我第一个问题。我从XAML和c#开始,希望我能解释我的问题并得到一些帮助。恐怕我的方法是不可能实现的,但也许我可以得到一些帮助与变通。
我需要打印很多卡片。进程正在运行,但冻结主线程。我想在BackgroundWorker中做这个批量打印,并在主线程中报告进度。我找到了一些示例,并创建了运行backgroundworker所需的所有东西。
问题是,对于每张卡片,我创建了一个堆栈面板,在那里我构建了图片,并最终使用FixedDocument和printdialog打印它。
类accreditation_graphic
第一行代码崩溃 void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
{
ObservableCollection<accreditation_field> _acc_list;
_acc_list = _param_acc_list;
accreditation_graphic _graphic = new accreditation_graphic();
// The sender is the BackgroundWorker object we need it to
// report progress and check for cancellation.
//NOTE : Never play with the UI thread here...
foreach (accreditation_field _acc in _acc_list)
{ [...] }
[...]
}
类是:
class accreditation_graphic
{
private StackPanel _stack = new StackPanel();
public accreditation_graphic()
{
}
[…]
和线程结束没有错误:private StackPanel _stack = new StackPanel();
是否有办法在后台工作人员创建一个堆栈面板?
谢谢。
正确的方法是使用后台工作线程来创建将显示在UI上的数据,而不是实际的UI元素。您可以使用进度报告机制向UI线程报告该数据。让UI线程上的代码选择该数据并使用它来生成实际的UI元素。
一个更好的解决方案:用ItemsContainer(或ItemsContainer的继承者)代替StackPanel并使用数据绑定。下面是一些简单的细节:
- 在XAML中使用ItemsContainer或从ItemsContainer继承的类。
- 在XAML中,通过数据绑定将ItemsContainer的ItemsSource设置为存储在视图模型中的可观察集合(即你将控件/页面的DataContext设置为什么)。 在XAML中,使用数据模板来可视化ItemsSource中的每个元素。
- 使用进度报告机制从后台线程中获取数据,并将其传输到数据绑定源的可观察集合中。
另一个建议:看看c#中新的async/await。你应该用它来代替后台worker。