【问题标题】:Xaml parsing and multithreadingXaml 解析和多线程
【发布时间】:2011-04-07 18:31:01
【问题描述】:

我想从后台线程中运行的代码加载 Xaml。 我知道我必须与调度员同步。但是,它失败了(抛出异常)。 为什么?

这里是代码

public MainWindow()
{
    InitializeComponent();
    Thread thread = new Thread(new ThreadStart(delegate
                    {
                        Dispatcher.Invoke(new Action(delegate
                        {
                            Content = XamlReader.Parse(
                                      "<Button xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
                                               Content='Hello World'/>");
                        }));
                    }));
    thread.Start();
}

【问题讨论】:

  • “失败”?发生什么了 ? (可能什么都没有,因为 o 是在另一个线程中创建和销毁的)。

标签: wpf multithreading xaml


【解决方案1】:

作为Pavlo mentioned,您还需要在调度程序中设置您的内容。

但是,我要说 - 这没什么用。

请记住,当您调用 Dispatcher.Invoke 或 BeginInvoke 时,您明确表示要在 UI 线程上运行该代码。通过启动一个除了调用回 UI 线程之外什么都不做的后台线程,您实际上是在 UI 线程上执行相同的工作,但缺点是会增加系统的额外开销以及更难的调试。在这种情况下,您应该直接加载文件。

【讨论】:

    【解决方案2】:

    这似乎是个坏主意,原因有几个。您是否希望从数据库或其他存储中获取 XAML 片段,而您无法在 C# 中创建这些控件的实例?你可以直接创建一个Button

    您能否让数据驱动您的可视化?一个很好的例子是拥有一组 ICommand 对象(CommandViewModel、RelayCommand 等)和一个您想要用来表示您的命令的 CommandView?在这种情况下,它可能是一个绑定到 CommandViewModel Title 或 Content 属性的&lt;Button&gt;

    然后您的后台线程可用于驱动数据(集合、属性)的填充,并且您的 UI 将被设计为灵活地适应预期的数据模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多