لا WPF توجيه أوامر حل مشكلة أو يزيد الأمر سوءا؟

StackOverflow https://stackoverflow.com/questions/466699

  •  19-08-2019
  •  | 
  •  

سؤال

وحسب ما فهمت، والهدف من نمط القيادة هو مساعدة التفاعل UI منفصل عن منطق التطبيق. مع الأوامر تنفذ بشكل صحيح، انقر على "طباعة" عنصر القائمة قد يؤدي إلى سلسلة من التفاعل مثل هذا:

(button) ---click executes command----> (command) ---calls Print() in app logic ---> (logic)

وهذا يشجعك على فصل UI من منطق التطبيق.

ولقد تم النظر في أوامر WPF، وبالنسبة للجزء الأكبر أرى كيف قد نفذت هذا النمط. ومع ذلك، أشعر إلى حد ما انهم <م> معقدة نمط القيادة وتمكن من تنفيذه في مثل هذه الطريقة التي يتم تثبيط لكم من فصل UI من منطق التطبيق.

وعلى سبيل المثال، النظر في هذا WPF نافذة بسيط هو أن يحتوي على زر للصق النص في مربع النص:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Paste"
                        Executed="CommandBinding_Executed"/>
    </Window.CommandBindings>
    <StackPanel>
        <TextBox x:Name="txtData" />
        <Button Command="Paste" Content="Paste" />
    </StackPanel>
</Window>

وهنا هو رمز وراء:

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            ApplicationCommands.Paste.Execute(null, txtData);
        }
    }
} 

وماذا فعلت تستفيد من الأمر؟ ويبدو لي أن أتمكن من وضع رمز من الأمر ملزم معالج الحدث إلى الحدث Click الزر بنفس السهولة. بالتأكيد، الآن يمكنني ربط عناصر واجهة المستخدم متعددة مع الأمر لصق وليس لدي سوى لاستخدام معالج حدث واحد، ولكن ماذا لو كنت تريد لصق إلى عدة مربعات النص مختلفة؟ كنت قد جعل المنطق معالج الحدث أكثر تعقيدا أو كتابة المزيد من معالجات الأحداث. وحتى الآن، وأنا أشعر بأن لدي هذا:

(button) ---executes Routed Command---> (Window) ---executes command binding----(command binding)
(logic) <---calls application logic--- (event handler) <-----raises event --------------|

وماذا أنا في عداد المفقودين هنا؟ يبدو أن طبقة إضافية من indirection لي.

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

المحلول

وبالإضافة إلى الأشياء التي سبق ذكرها، ما كنت قد نسيت في بلدكم سبيل المثال لصق محددة هي خصائص CommandTarget وCommandParameter. للصق، يمكنك تحديد مربع نص عن طريق وضع مثل CommandTarget.

وهذه الخصائص هي ضرورية للغاية عندما تريد استخدام نفس RoutedCommand من الضوابط المختلفة. انها تسمح لك لإعطاء معالج المنفذة بعض المعلومات عن السياق الذي يتم استدعاء الأمر.

نصائح أخرى

وقد تكون مفاهيم مربكة.

واجهة ICommand تدعم نمط القيادة. التي تسمح لك لإجراءات المستخدم المجردة إلى فئة إعادة استخدامها.

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

وأنا يفضلون استخدام RoutedCommands وRoutedUICommands عند بناء الضوابط. على سبيل المثال مربع نص تطبق UndoCommand لك ولا بد من guseture الإدخال بالفعل إلى السيطرة + Z . عند بناء مشاهدة نماذج، ومع ذلك، أفضله هو لICommand مخصص مع تطبيقات الداخلية للتنفيذ وCanExecute. يوفر هذا DelegateCommand في المنشور. وهذا يسمح للمصمم عرض / XAML للقلق فقط حول الأمر وليس الصحيحة معالجات تنفيذ / CanExecute للاستخدام. هذا من شأنه أن يسمح لنموذج عرض أكثر تعبيرا.

وفرع فلسطين. مندوب أوامر لا أميل بعد العمل (بأناقة) مع InputBindings. يمكن لبعض واحد في مايكروسوفت إصلاح هذا من فضلك!

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

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