WPF: перенос незамерзающих предметов из одного диспетчера в другой - PullRequest
1 голос
/ 25 февраля 2010

Мы загружаем объекты FixedPage из документа XPS, обрабатываем и отображаем его. Следующий код выполняет загрузку FixedPage из пакета:

        FixedPage fp = null;
        Package package;   // xps package
        Uri packageUri;    // uri of the package in the package store
        Uri fixedPageUri;  // uri of the fixed page
        Dispatcher _mainDispatcher // reference to the main dispatcher, passed to this function
                                   // this function runs in a different thread

        // get the fixed page stream
        Stream stream = package.GetPart(fixedPageUri).GetStream();

        // create a parser context to help XamlReader with the resources used in the page
        ParserContext pc = new ParserContext();
        pc.BaseUri = PackUriHelper.Create(packageUri, fixedPageUri);

        _mainDispatcher.BeginInvoke(
                    new UIRenderDelegate(delegate()
                    {
                        // this line takes its sweet time
                        fp = XamlReader.Load(stream, pc) as FixedPage;
                        stream.Dispose();
                    }), null).Wait();                       


        // return the created fixed page;

Однако этот вызов XamlReader.Load () занимает много времени (особенно для сложных FixedPages) и иногда блокирует пользовательский интерфейс. Мы могли бы сделать это в другом потоке с его собственным Dispatcher, но, поскольку класс FixedPage не доступен для freeazable, он не может использоваться основным потоком пользовательского интерфейса.

Есть ли способ обойти это? Сейчас мы застряли при рендеринге FixedPages в виде изображений с использованием RenderTargetBitmap, поскольку BitmapSource является Freezable.

1 Ответ

0 голосов
/ 25 февраля 2010

Сначала загрузите xaml в поток памяти, и они передадут поток памяти в поток пользовательского интерфейса. Разобрать поток памяти в потоке пользовательского интерфейса. Таким образом, вы можете сделать медленный ввод-вывод файла в фоновом потоке. В потоке пользовательского интерфейса будет выполняться только синтаксический анализ потока (с использованием XamlReader.Load).

Это artice объясняет, как это сделать.

...