WPF .NET 4.6.1 μμ© νλ‘κ·Έλ¨μμ VistaFolderBrowserDialogλ₯Ό μ¬μ©νλ €κ³ νλ©΄ μμ© νλ‘κ·Έλ¨μ΄ μ€λ¨λ©λλ€. λλ²κ·Έ λλ λ¦΄λ¦¬μ€ λͺ¨λμμ λλ²κ±°μμ μ€ννλ©΄ νλ₯νκ² μλν©λλ€.
λ€μν νΈμΆμ λ³κ²½νκ³ Nuget ν¨ν€μ§λ‘ μ ννμ¬ μν μ ν리μΌμ΄μ μμ μ΄λ₯Ό μ¬ννλ €κ³ μλνμ§λ§ μ¬μ ν μ λλ‘ μλν©λλ€.
VistaFolderBrowserDialogλ₯Ό νΈμΆνκ³ μν μ½λλ₯Ό λ΄ μμ© νλ‘κ·Έλ¨μ 볡μ¬/λΆμ¬λ£κΈ°νλ λ°©λ²μ λ¨μννλ €κ³ νμ§λ§ μ¬μ ν μ€λ¨λ©λλ€.
λ¬Έμ λ₯Ό μΆμ νλ μ΄μ λλ λ°©λ²μ λν μκ°μ΄ μμ΅λκΉ?
@matelich λ μ΄ μ€λͺ ν κ΅μν λμμ μ¬νν μ μμ΅λλ€.
μ²¨λΆ νμΌ μ Ookii.Dialogs.Wpf v1.1.0 (_μ΄ κΈμ μ°λ μμ μμ_)μ μ¬μ©νμ¬ VistaFolderBrowserDialog
λ₯Ό μ¬λ .NET 4.6.1μ μ¬μ©νλ WPF μ±μ μν νλ‘μ νΈμ΄λ©° λ€μμ μ€νν μ μμμ΅λλ€.
Debug
λΉλ _without_ λλ²κ±° μ°κ²°Debug
λΉλ _with_ λλ²κ±° μ°κ²°Release
λλ²κ±°κ° _ν¬ν¨λμ§ μμ_ λΉλRelease
λΉλ _with_ λλ²κ±° μ°κ²°μ μ§ λλ μμΈκ° λ°μνμ§ μμμ΅λλ€.
κ΅μν λμμ μ¬νν μ μλ λ°©λ²μ μλ €μ£Όμλ©΄ λ μμΈν μ‘°μ¬νκ² μ΅λλ€.
첨λΆλ μνμ κ΄λ ¨ μ½λ:
var dialog = new VistaFolderBrowserDialog
{
Description = "Please select a folder.",
UseDescriptionForTitle = true,
};
if (!VistaFolderBrowserDialog.IsVistaFolderDialogSupported)
{
MessageBox.Show(this,
"You are using an old Windows version. The regular folder browser dialog will open.",
"Sample folder browser dialog");
}
if (dialog.ShowDialog(this).GetValueOrDefault(false))
{
MessageBox.Show(this, "The selected folder was: " + dialog.SelectedPath,
"Sample folder browser dialog");
}
@augustoproiete, 빨리 λμμ μ£Όμ μ κ°μ¬ν©λλ€. λλ μ¬λ¬Όμ νμνκΈ° μν΄ λ€μν μ¬ν λ¨κ³λ₯Ό μλνμ΅λλ€. λ€λ₯Έ WPF μμ© νλ‘κ·Έλ¨μ λ λ§μ μ¬μ©λ²μ μΆκ°νμ¬ μλνμ§ μλ μ΄μ λ₯Ό μλ³ν μ μλ λͺ κ°μ§ κ³΅ν΅ μμκ° μλμ§ νμΈνλ €κ³ ν©λλ€.
λ‘κ·ΈμΈμ νκ³ λ΄ μμ© νλ‘κ·Έλ¨μμ μ¬ννλλ° int result = dialog.Show(owner);
in private bool RunDialog(IntPtr owner)
μ€λ¨λμμ΅λλ€.
κ΄λ ¨μ΄μλ κ² κ°μ΅λλ€ :
μ νν κ²½λ‘κ° κΈ΄ λ€νΈμν¬ κ²½λ‘μΌ λ μλκ° λλ € μ§λλ€.
Native code debugging
νμ±ννλ©΄ λλΆλΆμ μκ°μ΄ μ΄ νΈμΆ μ€νμ μ΄λκ°μμ μλΉλλ€λ κ²μ μ μ μμ΅λλ€.
win32u.dll!NtUserMsgWaitForMultipleObjectsEx
() μλ €μ§μ§ μμ
user32.dll!RealMsgWaitForMultipleObjectsEx() μ μ μμ
shell32.dll!SHProcessMessagesUntilEventsEx() μ μ μμ
shell32.dll!CChangeRouterProxy::RegisterThread() μ μ μμ
shell32.dll!SHChangeNotifyRegisterThread
() μλ €μ§μ§ μμ
comdlg32.dll!CFileOpenSave::Show() μ μ μμ
[λ€μ΄ν°λΈ μ νμΌλ‘ κ΄λ¦¬]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr μμ μ) 171ν C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window μμ μ) 157ν C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() 166ν C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(κ°μ²΄ λ°μ μ, System.Windows.RoutedEventArgs e) 56ν C#
λλ:
win32u.dll!00007ff9d17c9164() Unknown
user32.dll!00007ff9d2ca059d() Unknown
shell32.dll!SHProcessMessagesUntilEventsEx() Unknown
shell32.dll!CChangeRouterProxy::RegisterThread() Unknown
shell32.dll!SHChangeNotifyRegisterThread() Unknown
comdlg32.dll!CFileOpenSave::Show() Unknown
[Managed to Native Transition]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr owner) Line 171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner) Line 157 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() Line 166 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(object sender, System.Windows.RoutedEventArgs e) Line 56 C#
λλ:
ntdll.dll!RtlpHashStringToAtom() Unknown
ntdll.dll!RtlpFreeAllAtom
() μλ €μ§μ§ μμ
ntdll.dll!RtlpDereferenceAtom() μ μ μμ
ntdll.dll!RtlDeleteAtomFromAtomTable() μ μ μμ
kernel32.dll!InternalDeleteAtom
() μλ €μ§μ§ μμ
dui70.dll!DirectUI::κ°::_ZeroRelease() μ μ μμ
dui70.dll!DirectUI::DUIXmlParser::_DestroyTables(void) μ μ μμ
dui70.dll!DirectUI::DUIXmlParser::~DUIXmlParser() μ μ μμ
dui70.dll!DirectUI::DUIXmlParser::`λ²‘ν° μμ μλ©Έμ'() μ μ μμ
dui70.dll!DirectUI::AccHDelete
shell32.dll!_DUI_ShellStyleSheet_UninitThreadIfPossible(void) μ μ μμ
shell32.dll!DUI_ShellStyleSheet_UninitThread(void) μ μ μμ
shell32.dll!CDUIViewFrame::DestroyFrameWindow(void) μ μ μμ
shell32.dll!CExplorerBrowser::_CleanupFrame(void) μ μ μμ
shell32.dll!CExplorerBrowser::Destroy() μ μ μμ
comdlg32.dll!CFileOpenSave::_OnDestroyDialog() μ μ μμ
comdlg32.dll!CFileOpenSave::s_OpenSaveDlgProc() μ μ μμ
user32.dll!UserCallDlgProcCheckWow() μ μ μμ
user32.dll!DefDlgProcWorker() μ μ μμ
user32.dll!DefDlgProcW
() μλ €μ§μ§ μμ
user32.dll!UserCallWinProcCheckWow() μ μ μμ
user32.dll!DispatchClientMessage() μ μ μμ
user32.dll!__fnDWORD
() μλ €μ§μ§ μμ
ntdll.dll!KiUserCallbackDispatcherκ³μ
() μλ €μ§μ§ μμ
win32u.dll!NtUserDestroyWindow
() μλ €μ§μ§ μμ
user32.dll!DialogBox2() μ μ μμ
user32.dll!InternalDialogBox() μ μ μμ
user32.dll!DialogBoxIndirectParamAorW
() μλ €μ§μ§ μμ
user32.dll!DialogBoxIndirectParamW
() μλ €μ§μ§ μμ
comdlg32.dll!CFileOpenSave::Show() μ μ μμ
[λ€μ΄ν°λΈ μ νμΌλ‘ κ΄λ¦¬]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr μμ μ) 171ν C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window μμ μ) 157ν C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() 166ν C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(κ°μ²΄ λ°μ μ, System.Windows.RoutedEventArgs e) 56ν C#
κ°μ₯ μ μ©ν λκΈ
@augustoproiete, 빨리 λμμ μ£Όμ μ κ°μ¬ν©λλ€. λλ μ¬λ¬Όμ νμνκΈ° μν΄ λ€μν μ¬ν λ¨κ³λ₯Ό μλνμ΅λλ€. λ€λ₯Έ WPF μμ© νλ‘κ·Έλ¨μ λ λ§μ μ¬μ©λ²μ μΆκ°νμ¬ μλνμ§ μλ μ΄μ λ₯Ό μλ³ν μ μλ λͺ κ°μ§ κ³΅ν΅ μμκ° μλμ§ νμΈνλ €κ³ ν©λλ€.
λ‘κ·ΈμΈμ νκ³ λ΄ μμ© νλ‘κ·Έλ¨μμ μ¬ννλλ°
int result = dialog.Show(owner);
inprivate bool RunDialog(IntPtr owner)
μ€λ¨λμμ΅λλ€.