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();

是否有办法在后台工作人员创建一个堆栈面板?

谢谢。

c# XAML在BackGroundWorker中创建StackPanel

正确的方法是使用后台工作线程来创建将显示在UI上的数据,而不是实际的UI元素。您可以使用进度报告机制向UI线程报告该数据。让UI线程上的代码选择该数据并使用它来生成实际的UI元素。

一个更好的解决方案:用ItemsContainer(或ItemsContainer的继承者)代替StackPanel并使用数据绑定。下面是一些简单的细节:

  • 在XAML中使用ItemsContainer或从ItemsContainer继承的类。
  • 在XAML中,通过数据绑定将ItemsContainer的ItemsSource设置为存储在视图模型中的可观察集合(即你将控件/页面的DataContext设置为什么)。
  • 在XAML中,使用数据模板来可视化ItemsSource中的每个元素。
  • 使用进度报告机制从后台线程中获取数据,并将其传输到数据绑定源的可观察集合中。
顺便说一句,如果你刚开始学习c#/XAML,花点时间学习数据绑定和MvvM,这将是值得的。

另一个建议:看看c#中新的async/await。你应该用它来代替后台worker。