среда, 11 мая 2011 г.

Пустое содержимое в FolderBrowserDialog

Во время создания пользовательского окна в проекте установки (Visual Studio, Setup-Project) у меня возникли проблемы при отображении содержимого окна FolderBrowserDialog:

Быстрый поиск по инету указал на то, что пользоваться этим окно можно лишь в STA-потоке. Обычно этот параметер задается в начальной точке приложения в атрибуте STAThread:
[STAThread] static void Main() { ... }.

Но как указать модель STA в приложении, в котором не владеешь стартовой точкой, в таком как Setup-проект? Использовал следующий трюк, где я вызываю FolderBrowserDialog в новом потоке, для которого задаю STA-модель перед его старом. Сработало.

// Обработчик события кнопки выбора пути
private void dbPathButton_Click(object sender, EventArgs e) {

// Нормальный подход, но не работает
// FolderBrowserDialog fbd = new FolderBrowserDialog();
// fbd.SelectedPath = dbPathTextBox.Text;
// if (fbd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
// dbPathTextBox.Text = fbd.SelectedPath;

// Пришлось делать так:
pathBuff = dbPathTextBox.Text;
Thread thr = new Thread(ShowFolderBrowserDialog);
thr.SetApartmentState(ApartmentState.STA);
thr.Start();
thr.Join();
dbPathTextBox.Text = pathBuff;
}

String pathBuff = String.Empty;

public void ShowFolderBrowserDialog() {
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.SelectedPath = pathBuff;
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
pathBuff = fbd.SelectedPath;
}