سؤال

لقد فعلت بعض WPF برمجة و شيء واحد أنا أبدا حصلت على نمط القيادة.كل المثال يبدو أن يكون بني في تلك, تحرير, قص, لصق.أي شخص يكون مثالا أو اقتراح أفضل الممارسات مخصصة الأوامر ؟

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

المحلول

آه ها!سؤال لا أستطيع الإجابة!أولا, أود أن أذكر أن لدي شخصيا وجدت أنه من الأسهل لتحديد وربط الأوامر في قانون وليس في XAML.لأنها تتيح لي أن ربط معالجات الأوامر قليلا أكثر مرونة من جميع XAML النهج لا.

يجب عليك معرفة ما الأوامر كنت تريد أن يكون و ما صلتها.في طلبي, أنا حاليا لدي محاضرة عن تحديد أهمية تطبيق الأوامر كما يلي:

public static class CommandBank
{
  /// Command definition for Closing a window
  public static RoutedUICommand CloseWindow { get; private set; }

  /// Static private constructor, sets up all application wide commands.
  static CommandBank()
  {
    CloseWindow = new RoutedUICommand();
    CloseWindow.InputGestures.Add(new KeyGesture(Key.F4, ModifierKeys.Alt));
    // ...
  }

الآن, لأنني أردت أن تبقي رمز كل ذلك معا ، وذلك باستخدام رمز فقط نهج الأوامر يتيح لي وضع الطرق التالية في فئة أعلاه:

/// Closes the window provided as a parameter
public static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e)
{
  ((Window)e.Parameter).Close();
}

/// Allows a Command to execute if the CommandParameter is not a null value
public static void CanExecuteIfParameterIsNotNull(object sender, CanExecuteRoutedEventArgs e)
{
  e.CanExecute = e.Parameter != null;
  e.Handled = true;
}

الطريقة الثانية هناك حتى يمكن أن تكون مشتركة مع غيرها من الأوامر دون الحاجة إلى تكرار ذلك في كل مكان.

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

public partial class SimpleWindow : Window
{
  private void WindowLoaded(object sender, RoutedEventArgs e)
  {
    // ...
    this.CommandBindings.Add(
      new CommandBinding(
        CommandBank.CloseWindow,
        CommandBank.CloseWindowExecute,
        CommandBank.CanExecuteIfParameterIsNotNull));

    foreach (CommandBinding binding in this.CommandBindings)
    {
       RoutedCommand command = (RoutedCommand)binding.Command;
       if (command.InputGestures.Count > 0)
       {
         foreach (InputGesture gesture in command.InputGestures)
         {
           var iBind = new InputBinding(command, gesture);
           iBind.CommandParameter = this;
           this.InputBindings.Add(iBind);
         }
       }
    }

    // menuItemExit is defined in XAML
    menuItemExit.Command = CommandBank.CloseWindow;
    menuItemExit.CommandParameter = this;
    // ...
  }

  // ....
}

ثم أيضا في وقت لاحق معالجات الأحداث WindowClosing و WindowClosed الأحداث ، أنا لا أوصي لك الاستفادة الفعلية تنفيذ الأوامر صغيرة وعامة ممكن.كما في هذه الحالة ، لم أكن في محاولة لوضع التعليمات البرمجية التي يحاول وقف نافذة إغلاق إذا كان هناك بيانات لم يتم حفظها, ظللت أن رمز بقوة داخل WindowClosing الحدث.

اسمحوا لي أن أعرف إذا كان لديك أي متابعة الأسئلة.:)

نصائح أخرى

في أيلول / سبتمبر 2008 النسخة من MSDN مجلة براين نويس لديه مقالة ممتازة عن RoutedCommand/RoutedEvents!!!

هنا هو الرابط:http://msdn.microsoft.com/en-us/magazine/cc785480.aspx

الشيء عن XAML هو أنه على ما يرام 'بسيطة' البرامج ولكن للأسف لا تعمل بشكل جيد عندما تريد أن تفعل أشياء مثل وظائف حصة.نقول لديك عدة فئات و UI والتي كانت الأوامر التي لم تكن معطلة ، عليك أن تكتب 'CanAlwaysExecute' طريقة كل نافذة أو UserControl!هذا ليس جدا الجافة.

بعد قراءة عدة مدونات و من خلال محاولة العديد من الأشياء, لقد جعلت الخيار لجعل XAML بحتة حول تبدو أنماط الرسوم المتحركة و المشغلات.كل تركيب من معالجات الأحداث و القائد هو الآن في الخلفية التعليمات البرمجية.:)

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top