1

在 Windows Metro 应用程序(发布预览版)中,我从数据点动态创建图像并使用数据绑定来显示图像。

由于图像创建是相当繁重的处理,我希望它在一个任务中完成。所以我的财产目前编码如下:

public ImageSource Diagram
{
    get
    {
        if (this.diagram == null)
        {
             DiagramGenerator.GetDiagram(this.DataPoints, this.Width, this.Height).ContinueWith((t) =>
             {
                 this.Diagram = t.Result;
             }
        }
        return this.diagram;
    }
    set
    {
        this.SetProperty(ref this.diagram, value);
    }
}

DiagramGenerator 看起来像:

public static async Task<ImageSource> DiagramGenerator.GetDiagram(List<DataPoint> dataPoints, int width, int height)
{
    WriteableBitmap bmp = BitmapFactory.New(width, height);

    // Build the image...

    return bmp;
}

在 Xaml 中,我的绑定非常简单

<Image Source="{Binding Diagram}" Stretch="UniformToFill"/>

不幸的是,使用上面的代码不起作用。

我在 OnPropertyChanged 方法中出现异常(例如,在上面的 this.Diagram = t.Result 之后):“应用程序调用了一个为不同线程编组的接口。”

然后我尝试使用以下方法编组到 UI 线程:

Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Norma, () => { this.Diagram = t.Result; });

但这也不起作用,因为 Window.Current 为空!

怎么能解决这个问题?

非常感谢您的建议。

4

1 回答 1

0

您可以在 UI 线程上获取 Window.Current.Dispatcher 并将其存储以供以后使用,例如在创建 Diagram 对象时。或者,Dispatcher 存储在 DependencyObject 中,因此您可以从那里获取它(即它在任何 UIElement 对象中)。

于 2012-07-17T01:37:16.523 回答