Ookii-dialogs-wpf: يتم تجاهل VistaOpenFileDialog.InitialDirectory

تم إنشاؤها على ٢٦ سبتمبر ٢٠١٩  ·  9تعليقات  ·  مصدر: ookii-dialogs/ookii-dialogs-wpf

يتم تجاهل تهيئة مربع حوار باستخدام الخاصية InitialDirectory التي تم تعيينها إلى مجلد محلي ومجلد موجود.
يعرض مربع الحوار دائمًا المجلد الأخير الذي تم فتح الملف فيه.

 VistaOpenFileDialog dialog = new VistaOpenFileDialog();
 dialog.Filter = "JSON Dateien (*.json)|*.json";
 dialog.InitialDirectory = "C:\\";

سلوك متوقع:
يقوم VistaOpenFileDialog دائمًا بعرض محتوى C: \ عند تعيين InitialDirectory على "C: \".

نظام التشغيل Windows 10 Pro 1903 / .Net Framework 4.6

good first issue hacktoberfest help wanted needs-design

التعليق الأكثر فائدة

في حين أنه من الصحيح أن العديد من تطبيقات Windows لديها سلوك افتراضي "ذكي" لتذكر مسارك الأخير ، إلا أن هناك العديد من المواقف التي يرغب فيها مطور التطبيق في تحديد دليل أولي معين لمساعدة المستخدم. بالنسبة إلى مشهد التطبيق الخاص بنا ، يعد هذا هو السلوك الافتراضي ، حيث يتوقع المستخدمون التحميل من / الحفظ إلى أدلة محددة متعلقة بالمشروع. استخدام الدليل الأخير "الذكي" من notepad / paint / word أمر مزعج وعديم الفائدة هنا.

زائد: Microsoft.Win32.OpenFileDialog له نفس الخاصية بالضبط ويستخدمها كما هو متوقع.

ال 9 كومينتر

شكرا للإبلاغ عنsoulflyman. ومع ذلك ، أعتقد أن هذا هو السلوك "الصحيح" لأنه يطابق ما يحدث في جميع التطبيقات الأخرى التي تأتي مع Windows - أي أنها تتذكر آخر مجلد تم استخدامه.

يجب أن تكون قادرًا على إعادة إنتاج نفس الشيء باستخدام Notepad أو Paint.

أبلغ buildcomplete عن مشكلة مماثلة مع PR # 2 ، لذا ربما نحتاج إلى طريقة لتجاوز هذا السلوك بطريقة ما (؟) ، من الناحية المثالية كإعداد للاشتراك لا يقدم تغييرًا مفاجئًا.

هذا يبدو رائعًا ، سأكون بخير تمامًا مع تسوية جديدة كما ذكرت.

كنت على دراية بالسلوك الافتراضي (مثل المفكرة) ولكنني أصححت هذا السلوك للتغيير عند ضبط InitialDirectory يدويًا.
كان افتراضي أن InitialDirectory يعني أن يكون الدليل الذي يتم عرضه في كل مرة يتم فيها عرض مربع الحوار أو على الأقل في مثيل التطبيق قيد التشغيل. لم أكن أتوقع أن يتم تجاهلي حتى بعد إغلاق التطبيق وإعادة تشغيله.

أواجه نفس المشكلة.
جربت طرقًا / ترتيبًا مختلفًا لتعيين خصائص VistaSaveFileDialog المتنوعة دون نجاح. يتجاهل مربع الحوار دائمًا الإعداد InitialDirectoy ويستخدم الإعداد الافتراضي.

لقد أكدت أنه يتم تعيين "_initialDirectory" على المسار المطلوب في VistaFileDialog.cs.
من هناك ، تشق القيمة طريقها إلى CreateItemFromParsingName(string path) في NativeMethods.cs ، ثم تختفي أسفل ثقب COM.

[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
public static extern int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IntPtr pbc, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);

  public static Interop.IShellItem CreateItemFromParsingName(string path)
 {
     object item;
     Guid guid = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe"); // IID_IShellItem
     int hr = NativeMethods.SHCreateItemFromParsingName(path, IntPtr.Zero, ref guid, out item);
     if( hr != 0 )
         throw new System.ComponentModel.Win32Exception(hr);
     return (Interop.IShellItem)item;
 }

يبدو أن هذه الطريقة SHCreateItemFromParsingName فشلت ، حيث يبدو أن كائن COM الذي تم إرجاعه فارغ؟

CreateItemFromParsingName

لقد أضفت SetLastError = true لتوقيع الطريقة وحاولت Marshal.GetLastWin32Error() بعد الاستدعاء ، لكنها ترجع 0.

في حين أنه من الصحيح أن العديد من تطبيقات Windows لديها سلوك افتراضي "ذكي" لتذكر مسارك الأخير ، إلا أن هناك العديد من المواقف التي يرغب فيها مطور التطبيق في تحديد دليل أولي معين لمساعدة المستخدم. بالنسبة إلى مشهد التطبيق الخاص بنا ، يعد هذا هو السلوك الافتراضي ، حيث يتوقع المستخدمون التحميل من / الحفظ إلى أدلة محددة متعلقة بالمشروع. استخدام الدليل الأخير "الذكي" من notepad / paint / word أمر مزعج وعديم الفائدة هنا.

زائد: Microsoft.Win32.OpenFileDialog له نفس الخاصية بالضبط ويستخدمها كما هو متوقع.

لدي نفس الحاجة.
هل يمكنك إضافة إعداد يمكن أن يسمح بتعيين الدليل الأولي لمربع الحوار من فضلك؟
شكرا لك.

ذهبت إلى رمز مكتبة Ookii. ثم وجدت كيفية أخذ الخاصية InitialDirectory بعين الاعتبار.
يجب عليك تغيير هذا السطر من التعليمات البرمجية إلى الملف VistaFileDialog.cs
إلى الطريقة internal virtual void SetDialogProperties(Ookii.Dialogs.Wpf.Interop.IFileDialog dialog)
تغيير هذا الجزء من التعليمات البرمجية

// Initial directory
if( !string.IsNullOrEmpty(_initialDirectory) )
{
    Ookii.Dialogs.Wpf.Interop.IShellItem item = NativeMethods.CreateItemFromParsingName(_initialDirectory);
    dialog.SetDefaultFolder(item);
}

ل

// Initial directory
if( !string.IsNullOrEmpty(_initialDirectory) )
{
    Ookii.Dialogs.Wpf.Interop.IShellItem item = NativeMethods.CreateItemFromParsingName(_initialDirectory);
    dialog.SetFolder(item);
}

تم ذلك.
الآن سيبدأ مربع حوار Ookii في خاصية InitialDirectory .

آمل أن يساعد.

@ gitjsdr26 يمكنك إنشاء علاقات عامة لـ

nzain ، آسف لا أعرف كيف أفعل هذا مع GitHub.

حسنًا ، لقد جمعت بعض المعلومات الإضافية لتسليط الضوء على هذه المشكلة.

نتحدث عن خاصية InitialDirectory مثل تلك الموثقة لـ OpenFileDialog.InitialDirectory الخاص بـ WPF. الوثائق تقول:

الحصول على أو تعيين الدليل الأولي الذي يتم عرضه بواسطة مربع حوار ملف.

يتوقع مستخدمو Ookii Dialogs نفس السلوك لأن الخاصية لها نفس الاسم. أوافق ، في كثير من الحالات لا ينبغي تعيين هذه الخاصية (المفكرة وما إلى ذلك) ، لكن هذه قصة مختلفة. _If_ تم تعيين الخاصية ، يجب أن تعمل كما هو متوقع.

و InitialDirectory لا ينبغي الخلط بينه وبين IFileDialog::SetDefaultFolder وهو ما يسمى حاليا. هنا الوثائق تقول:

يضبط المجلد المستخدم كمجلد افتراضي إذا لم تكن هناك قيمة مجلد مستخدمة مؤخرًا متاحة.

لست متأكدًا مما إذا كان هذا (لا يتوفر مجلد تم استخدامه مؤخرًا) هو الحال على الإطلاق. لم يكن لإعداد المجلد الافتراضي أي تأثير بالنسبة لي. إذا كانت هذه الوظيفة مطلوبة لأي شخص ، فيجب أن تكون متاحة كخاصية DefaultDirectory . قد تكون قطعة أثرية قديمة في العصور القديمة - إذا كان أي شخص يعرف متى يكون لهذا تأثير ، فيرجى إبلاغي بذلك.

العلاقات العامة؟

# 2 العلاقات العامة مفتوحة لمدة عامين الآن (!) وتقترح شيئًا مشابهًا. على الرغم من أن المؤلف buildcomplete يذكر أنه يعمل مرة واحدة على الأقل في السيناريو الخاص به. يبدو أن إصلاحه يستند إلى رمز قديم ، ولكنه يفعل نفس الشيء الذي يقترحه @ gitjsdr26 : تغيير المكالمة
IFileDialog::SetDefaultFolder(...) إلى IFileDialog::SetFolder(...) .

لا أريد إضاعة الوقت في إنشاء العلاقات العامة (سأغير هذا السطر الفردي أيضًا).

augustoproiete من فضلك أخبرنا برأيك في هذا :)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

vpenades picture vpenades  ·  4تعليقات

mgpreston picture mgpreston  ·  4تعليقات

matelich picture matelich  ·  3تعليقات

stricq picture stricq  ·  10تعليقات

mu88 picture mu88  ·  9تعليقات