Разве невозможно показать FolderBrowserDialog из потока, не являющегося пользовательским интерфейсом? - PullRequest
1 голос
/ 31 мая 2010

У меня проблема с показом FolderBrowserDialog экземпляра, созданного и вызванного из потока, не являющегося пользовательским интерфейсом. Это не получает должным образом.

Более конкретно, он не показывает дерево папок, а отображает только Создать новую папку ОК и Отмена

альтернативный текст http://i49.tinypic.com/51dbog.png

Ответы [ 2 ]

3 голосов
/ 31 мая 2010

Все диалоговые окна оболочки, включая FolderBrowserDialog, требуют, чтобы COM-квартира потока была установлена ​​в STA. Возможно, вам не хватает вызова Thread.SetApartmentState ():

    private void button1_Click(object sender, EventArgs e) {
        var t = new Thread(() => new FolderBrowserDialog().ShowDialog());
        t.IsBackground = true;
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
    }

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

2 голосов
/ 31 мая 2010

Я не уверен, почему вы хотели бы сделать это. В рабочем потоке должны быть доступны все необходимые значения для вашего расчета. Не нужно взаимодействовать с пользователем, чтобы получить больше информации.
Может быть, редизайн будет более полезным в вашем случае. Подумайте о том, чтобы предоставить выбранную папку вашему рабочему потоку, прежде чем запускать ее.

РЕДАКТИРОВАТЬ (ответить на комментарий):
Если вы хотите сделать некоторые записи, мой ответ по-прежнему применяется. Ваш рабочий поток должен знать, где регистрировать исключения, и не начинать спрашивать пользователя.
Используете ли вы каркас регистрации? Если нет, посмотрите, например, log4net . Здесь вы обычно предварительно конфигурируете свою регистрацию (уровень журнала, путь, формат, ...) в xml-файле. Нет необходимости взаимодействия с пользователем. Хотя пользователь может изменить путь регистрации (в файле xml).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...