WPF UI Status Thread - PullRequest
       12

WPF UI Status Thread

3 голосов
/ 23 февраля 2010

У меня есть приложение wpf, которое занимает ~ 30 секунд для создания карты / графики. Я читал, что нет простого способа привязаться к потоку рендеринга пользовательского интерфейса, чтобы получить обновление прогресса. Поэтому я собирался использовать счетчик в конвертере значений, который окрашивает мою карту, но он также находится в потоке пользовательского интерфейса, поэтому мой вопрос: кто-нибудь еще нашел какие-нибудь изящные методы работы с потоком рендеринга?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 23 февраля 2010

Вы можете создать свою карту / графику в BackgroundWorker , который позволяет вызывать ReportProgress в вашей функции, где вы можете установить процент выполнения и вызвать событие ProgressChanged для обновления вашего пользовательского интерфейса.

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

Если вы используете привязку для привязки вашего пользовательского интерфейса к источнику данных, для возврата которого может потребоваться много времени, вы можете установить IsAsync = True для привязки, чтобы привязка стала асинхронной.

Если вы хотите отображать некоторые другие данные (даже анимацию, я думаю) во время загрузки вашего источника данных, вы можете использовать PriorityBinding

НТН

Риана

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

Я не уверен, что это то, что вы ищете.

Я использую что-то похожее на код ниже, чтобы загрузить около 300 изображений (около 200 МБ) и вообще не замедлять работу интерфейса. (пользователь может видеть каждое загружаемое изображение, я просто сохраняю пустое изображение заполнителя до тех пор, пока не загрузится окончательное изображение)

Изображения загружаются в фоновом потоке, а затем вызывается функция для фактического помещения их в сцену WPF.

вот простой пример использования текстового поля. Вы можете вызвать эту функцию из любого потока, и она сработает, если потребуется изменить поток GUI. (для моего проекта, конечно, я делаю это с растровыми изображениями, а не с текстовым полем).

    delegate void UpdateUIThreadDelegate(String str);

    public void DisplayString(String strMessage)
    {
            if (this.InvokeRequired)
            {
                UpdateUIThreadDelegate updateDelegate = DisplayString;

                this.BeginInvoke(updateDelegate, strMessage);

                return;
            }

            myTextBox.Text = strMessage;
    }

Приветствие Anton

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

Когда вы говорите «поток рендеринга пользовательского интерфейса», вы имеете в виду скрытый поток рендеринга из внутренних элементов WPF или потока пользовательского интерфейса?

В любом случае, вам не поможет отдельный поток, который строит вашу карту и уведомляет пользовательский интерфейс о прогрессе?

...