Во время создания пользовательского окна в проекте установки (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;
}
среда, 11 мая 2011 г.
Подписаться на:
Сообщения (Atom)