سؤال

لذلك أقوم ببناء تطبيق سيكون له الكثير من النوافذ ، كل ذلك بنفس التخطيط الأساسي:

  1. نافذة رئيسية
  2. شعار في الزاوية العليا
  3. كتلة العنوان
  4. عرض حالة أسفل أسفل
  5. منطقة لعناصر تحكم محددة للنافذة.

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

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

المحلول

يمكنك إنشاء ControlTemplate جديد يستهدف نافذة لإنجاز ذلك كما هو موضح أدناه.

<ControlTemplate x:Key="WindowControlTemplate1" TargetType="{x:Type Window}">
    <Border 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}"
        >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="0.93*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.21*"/>
                <ColumnDefinition Width="0.79*"/>
            </Grid.ColumnDefinitions>

            <ContentPresenter 
                Grid.ColumnSpan="2" 
                Grid.Row="1" 
                Content="{TemplateBinding Content}" 
                ContentTemplate="{TemplateBinding ContentTemplate}"
                />
            <ResizeGrip 
                HorizontalAlignment="Right" 
                x:Name="WindowResizeGrip" 
                VerticalAlignment="Bottom" 
                IsTabStop="False" 
                Visibility="Collapsed" 
                Grid.Column="1" 
                Grid.Row="2"
                />
            <TextBlock Text="My Logo" />
            <TextBlock Grid.Column="1" Text="My Title"/>
            <StatusBar Height="20" Grid.ColumnSpan="2" Grid.Row="2"/>
        </Grid>
    </Border>

    <ControlTemplate.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
                <Condition Property="WindowState" Value="Normal"/>
            </MultiTrigger.Conditions>
            <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/>
        </MultiTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

نصائح أخرى

إذا كنت شجاعًا بما يكفي لاتخاذ تحول معماري كبير يمكنك التفكير فيه compositewpf (PRISM المسمار سابقًا) من الأنماط والممارسات في Microsoft.

من المثير للاهتمام بالنسبة لك القدرة على تحديد "المناطق" في قذيفة (أي نافذة) ثم استخدام طرق العرض لملء المناطق. يستخدم نمط عرض الموديل-المركز للسماح بتطوير مستقل لـ "طرق العرض" من النموذج مما يمكن نقله بسهولة مع مرور الوقت لأن القشرة تحدد المناطق فقط ولا يتم ربطها مباشرة بما يتم وضعه فيه. في الأساس ، يساعد هذا في فصل القشرة من وجهات النظر والآراء من بعضها البعض وجعل من السهل اختبار الوحدة ... بلاه ، بلاه بلاه.

إنها قفزة كبيرة وشيء سيؤدي إلى إبطائك لتبدأ ، على الرغم من أن وضعك هو أحد أنواع التطبيقات التي يهدف إلى معالجة CompositewPF.

كجزء من compositewpf ، ستحتاج إلى أن تأخذ على متن مختلف الأنماط التي يمكن أن تخلط بين القادمين الجدد ، على سبيل المثال UnityContainer ، انعكاس السيطرة ، MVP (أو نموذج/عرض/طريقة عرض) وحقن التبعية.

أستطيع أن أتذكر عندما بدأت لأول مرة بتطبيقات العينة التي تحير لأنه ليس من الواضح كيف تم إنشاء بعض الآراء على الأرض! ستعمل حاوية الوحدة على إنشاء كائنات وتستدعي المُنشئين المعلمة بطريقة سحرية.

CompositewpF هو حل أنيق لسؤالك ولكن ليس بسيطًا أو مباشرًا. بعد استخدام compositewpf في مشروعي الأخير ، أنوي استخدامه مرة أخرى للتطبيق المناسب التالي.

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

لماذا تستخدم بالضبط "الكثير من النوافذ؟" لماذا لا مجرد نافذة واحدة مع التحكم في علامة التبويب؟ أو نافذة واحدة مع عناصر تحكم المستخدم؟

بغض النظر ، للإجابة على سؤالك ، فإن UserControls هي إحدى الطرق التي تريد الحصول عليها من الوظائف التي تصفها على أنها تريدها.

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

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

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