سؤال

لي OpenFileDialog لديه واحد واحد Filter وهو أيضا DefaultExt. وبعد أتساءل لماذا، عندما يفتح مربع الحوار، أحصل أيضا على جميع اختصارات الإنترنت المدرجة (لا بأس في الحصول على الاختصارات إلى المجلدات، على سبيل المثال، ولكن ليس ملفات * .url).

هل هناك بعض التبديل السحري الذي يمكنني تشغيله من أجل تثبيتها في القائمة المعروضة للمستخدم؟

حاليا، لا بد لي من التعامل مع الشرط في FileOk معالج الأحداث عن طريق الإعداد e.Cancel ل true إذا اكتشفت أن المستخدم حدد *.URL ملف (لا يعمل 100٪ من الوقت أيضا، يبدو أن بعض الاختصارات لا تزال تواجه FileOk منقي). عدم الحصول عليها في القائمة في المقام الأول سيكون أفضل، رغم ذلك.

هل كانت مفيدة؟

المحلول

أنت تصحيح أن يقوم مربعات الحوار الشائعة في ملف Windows المفتوح بإظهار اختصارات الإنترنت مع المجلدات. ليس لدي أي فكرة عن سبب وجود هذا السلوك، ولكنه يحدث ذلك، ويحدث في Win32 (جرب المفكرة للتحقق منه) بالإضافة إلى تطبيقات WinForms.

هناك طريقة للتغلب على هذا، ولكن تحذير: إنه اختراق! إذا كنت تستمد فئة مربع حوار ملف مخصص من فئة Filedialog، فستحصل على عدد قليل من الأحداث المحمية التي يمكنك استخدامها لتخصيص كل جانب من جوانب تشغيل Filedialog.

كتب دينو إسبوزيتو مقالة مجلة MSDN في نوفمبر 2003 والتي توضح كيف تعمل هذه التقنية. لم تعد هذه المقالة موجودة في موقع MSDN ولكن يمكنك الحصول عليها على أرشيف ماكينات الطريق هنا: http://web.archive.org/web/20117123625/http://msdn.microsoft.com/en-us/magazine/cc300434.aspx..

ما عليك القيام به هو ربط أو فئة Subclass WNDProC من مربع حوار الملف، وإلقاء نظرة يدويا من خلال التحكم في قائمة الملفات، وتحديد الإدخالات التي كانت اختصارات، وإرسال رسائل Windows إلى عنصر تحكم قائمة الملفات لإزالة هذه العناصر. ثم كنت بحاجة إلى مشاهدة لتحديث هذه القائمة (على سبيل المثال من تغيير الدليل) وكرر عملية التصفية.

سيكون هذا اختراق ضخم، لكنه ممكن.

إذا كان هذا هو الكثير من العمل أو الاختراق أكثر من اللازم، أود أن أقترح فقط استخدام حدث FileK لمنع المستخدمين من تحديد اختصار عن طريق العودة Cancel=true من CanceleVentheandler لحدث Filek.

نصائح أخرى

مزعج. يمكنك إضاربهم عن طريق تنفيذ معالج لحدث Filek حتى لا يمكن للمستخدم أبدا اختيار واحد:

private void openFileDialog1_FileOk(object sender, CancelEventArgs e) {
  string ext = System.IO.Path.GetExtension(openFileDialog1.FileName);
  if (String.Compare(ext, ".url", true) == 0) e.Cancel = true;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top