نظرة عامة حول Windows WPF

يتفاعل المستخدمون مع تطبيقات Windows Presentation Foundation (WPF) المستقلة من خلال الإطارات. الغرض الأساسي من الإطار هو استضافة المحتوى الذي يجسد البيانات ويتيح للمستخدمين التفاعل مع البيانات.  توفر تطبيقات WPF المستقلة الاطارات الخاصة بهم باستخدام فئة Window . يقدم هذا الموضوع Window قبل تغطية أساسيات إنشاء وإدارة الاطارات في التطبيقات المستقلة.

ملاحظةملاحظة

تطبيقات WPF المستضافة للمستعرض ، بما في ذلك تطبيقات مستعرض XBAP (XBAP) و صفحات Extensible Application Markup Language (XAML) المفقودة ، لا توفر الاطارات الخاصة بهم .بدلاً من ذلك، تتم استضافتها في اطارات يوفرها Windows Internet Explorer.انظر نظرة عامة حول تطبيقات مستعرض WPF XAML

يشتمل هذا الموضوع على الأقسام التالية.

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

فئة الاطار

يوضح الرسم التالي أجزاء تأسيسية للإطار .

عناصر النافذة

ينقسم الاطار إلى ناحيتين: منطقة غير العميل و منطقة العميل.

يتم تطبيق اطار منطقة غير العميل بواسطة WPF وتتضمن أجزاء الإطار الشائعة لمعظم الإطارات ، متضمناً ما يلي:

  • الحد

  • شريط العناوين

  • رمز.

  • أزرار "تصغير" و"تكبير" و"أغلاق".

  • زر إغلاق.

  • قائمة النظام بعناصر القائمة التي تسمح للمستخدمين بتصغير ، تكبير ، استعادة ، نقل, تغيير حجم و إغلاق الإطار.

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

في WPF, يتم تغليف الإطار بواسطة فئة Window التي تستخدمها للقيام بما يلي:

  • عرض إطار.

  • تكوين حجم ، موضع ومظهر الإطار.

  • المحتوى الخاص بالتطبيق المضيف.

  • إدارة عمر الإطار.

تطبيق الإطار

تطبيق إطار نموذجي يتضمن كل من المظهر و السلوك ، حيث المظهر يقوم بتعريف كيفية ظهور الإطار للمستخدمين كما يقوم السلوك بتعريف الطريقة التي يعمل بها أساليب الإطار كما يتفاعل المستخدمون معه. في WPF ، يمكنك تطبيق مظهر وسلوك الاطار باستخدام إما تعليمات برمجية أو العلامات XAML .

بشكل عام, على الرغم من ذلك، فإن مظهر الإطار يتم تنفيذه باستخدام العلامات XAML ، والسلوك الخاص به يتم تنفيذه باستخدام التعليمات البرمجية الخلفية, كما هو موضح في المثال التالي.

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.MarkupAndCodeBehindWindow">

  <!-- Client area (for content) -->

</Window>

Imports System.Windows ' Window

Namespace SDKSample
    Partial Public Class MarkupAndCodeBehindWindow
        Inherits Window
        Public Sub New()
            InitializeComponent()
        End Sub
    End Class
End Namespace
using System.Windows; // Window

namespace SDKSample
{
    public partial class MarkupAndCodeBehindWindow : Window
    {
        public MarkupAndCodeBehindWindow()
        {
            InitializeComponent();
        }
    }
}

لتمكين العلامات XAML و ملف وملف التعليمات البرمجية الخلفية للعمل معاً ، فإن التالي مطلوب:

  • في العلامات ، فإن العنصر Window يجب أن يتضمن سمة x:Class. عند بناء التطبيق ، فإن وجود x:Class في ملفات العلامات يسبب Microsoft build engine (MSBuild) لإنشاء فئة partial المشتقة من Window و لها الاسم المحدد بواسطة السمة x:Class. يتطلب هذا إضافة تصريح مساحة الاسم XML من أجل مخطط XAML ( xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"). فئة partial المنشأة تقوم بتنفيذ أسلوب InitializeComponent ، والذي يتم استدعاؤه لتسجيل الأحداث وتعيين الخصائص الذي يتم تنفيذها في العلامات.

  • في التعليمات البرمجية الخلفية يجب أن تكون الفئة فئة partial بنفس الاسم المحدد بواسطة السمة x:Class في العلامات ، ويجب اشتقاقها من Window. يسمح ملف التعليمات البرمجية الخلفية هذا بأن يتم اقترانه بفئة partial التي يتم إنشاءها من أجل ملف العلامات عند إنشاء التطبيق (راجع إنشاء تطبيق WPF (WPF)).

  • في تعليمات برمجية-خلف Windowيجب أن يقوم تطبيق فئة الدالة الإنشائية الذي يستدعي InitializeComponentالأسلوب. InitializeComponentهو مطبقة بترميز إنشاء ملفpartialفئة الأحداث regهوter وتعيين خصائص التي تم تعريفها في العلامة.

ملاحظةملاحظة

عند إضافة Window جديد للمشروع الخاص بك باستخدام Microsoft Visual Studio ، يتم تنفيذ Window باستخدام كل من "العلامات" و "التعليمات البرمجية الخلفية ويتضمن التكوين الضروري لإنشاء الاقتران بين العلامات و ملفات التعليمات البرمجية الخلفية كما هو موضح هنا.

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

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.MarkupAndCodeBehindWindow">
  <!-- Client area (for content) -->
  <Button Click="button_Click">Click This Button</Button>
</Window>

Imports System.Windows

Namespace SDKSample
    Partial Public Class MarkupAndCodeBehindWindow
        Inherits Window
        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            MessageBox.Show("Button was clicked.")
        End Sub
    End Class
End Namespace
using System.Windows;

namespace SDKSample
{
    public partial class MarkupAndCodeBehindWindow : Window
    {
        public MarkupAndCodeBehindWindow()
        {
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Button was clicked.");
        }
    }
}

تكوين تعريف إطار من أجل MSBuild

كيفية تطبيق الاطار الخاص بك تحدد كيفية تكوينه لـ MSBuild. من أجل الإطار التي يتم تعريفه باستخدام كلا من علامات XAML و التعليمات البرمجية الخلفية :

  • يتم تكوين العلامات XAML كعناصر MSBuild Page .

  • يتم تكوين ملفات التعليمات البرمجية الخلفية كـعناصر MSBuild Compile .

يظهر هذا في ملف مشروع MSBuild التالي.

<Project ... xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    ...
    <Page Include="MarkupAndCodeBehindWindow.xaml" />
    <Compile Include=" MarkupAndCodeBehindWindow.xaml.cs" />
    ...
</Project>

للحصول على معلومات حول إنشاء تطبيقات WPF، راجع إنشاء تطبيق WPF (WPF).

مدة بقاء النافذة

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

يشتمل هذا القسم على الأقسام الفرعية التالية.

  • فتح الإطار
  • تنشيط الإطار
  • إغلاق إحدى النوافذ
  • أحداث عمر الإطار

فتح الإطار

لفتح إطار ، قم أولاً بإنشاء مثيل له, والذي هو موضّح في المثال التالي .

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    Startup="app_Startup">
</Application>

Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub app_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Create a window
            Dim window As New MarkupAndCodeBehindWindow()

            ' Open a window
            window.Show()
        End Sub
    End Class
End Namespace
using System.Windows;
namespace SDKSample
{
    public partial class App : Application
    {
        void app_Startup(object sender, StartupEventArgs e)
        {
            // Create a window
            MarkupAndCodeBehindWindow window = new MarkupAndCodeBehindWindow();

            // Open a window
            window.Show();
        }
    }
}

في هذا المثال، فإن MarkupAndCodeBehindWindow يتم إنشاء مثيل له عند بدء التطبيق و الذي يحدث عند تشغيل الحدث Startup .

عندما يتم إنشاء مثيل للإطار ، يتم إضافة مرجع إليه تلقائياً إلى قائمة الإطارات التي تتم إدارتها بواسطة الكائن Application (راجع Application.Windows). بالإضافة إلى ذلك، أول إطار يتم إنشاء مثيل له , بشكل افتراضي ، يتم تعيينه بواسطة Application كإطار التطبيق الرئيسي (راجع Application.MainWindow).

يتم الإطار أخيراً بواسطة استدعاء الأسلوب Show; تظهر النتيجة في الشكل التالي.

فتح نافذة بواسطة استدعاء Window.Show

الإطار المفتوح بواسطة استدعاء Show هو إطار غير مشروط مما يعني أن التطبيق يعمل في وضع يسمح للمستخدمين لتنشيط الإطارات الأخرى في نفس التطبيق

ملاحظةملاحظة

ShowDialog يتم استدعاؤه لفتح الإطارات مثل مربعات حوار مشروطة.لمزيد من المعلومات، راجع نظرة عامة حول مربعات الحوار.

عند استدعاءShow ، يقوم الإطار بأداء تهيئة العمل الظهور لإنشاء بنية تحتية تسمح لتلقي إدخال المستخدم. عند تهيئة الإطار ، يتم تشغيل الحدث SourceInitialized و يتم عرض الإطار .

كاختصار ، يمكن تعيين StartupUri لتحديد الإطار الأول الذي سيتم فتحه تلقائياً عند بدء تشغيل التطبيق.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="PlainWindow.xaml" />

عند بدء تشغيل التطبيق ، فإن الإطار المحدد بواسطة قيمة StartupUri يتم فتحه وضعياً، داخليًا, يتم فتح الإطار بواسطة استدعاء أسلوب Show الخاص به.

ملكية الإطار

الإطار الذي يتم فتحه باستخدام أسلوب Show ليس لديه علاقة ضمنية مع الإطار الذي قام بإنشائه; يمكن للمستخدمين التفاعل مع الإطار بشكل مستقل عن الآخر ، مما يعني إن كل من الإطارات يمكنه القيام بما يلي:

  • قم بتغطية الآخر (إلا إذا كان واحد من الإطارات لديه الخاصية Topmost قد تم تعيينها إلى true).

  • يتم تصغيره ، تكبيره و استعادته دون التأثير على الآخر.

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

' Create a window and make this window its owner
Dim ownedWindow As New Window()
ownedWindow.Owner = Me
ownedWindow.Show()
// Create a window and make this window its owner
Window ownedWindow = new Window();
ownedWindow.Owner = this;
ownedWindow.Show();

بعد إنشاء الملكية:

  • الإطار التابع يمكنه الرجوع إلى الإطار المالك بواسطة اختبار القيمة الخاصة بخاصية Owner الخاصة به .

  • يمكن أن يكتشف الإطار المالك كافة الإطارات الذي يملكها بواسطة اختبار قيمة خاصية OwnedWindows الخاصة به.

منع تنشيط الإطار

هناك سيناريوهات حيث الإطارات لا يجب أن يتم تنشيطها عند إظهارها ، مثل إطارات المحادثة من عينة تطبيقات مرسل الإنترنت أو إطارات الإعلام في تطبيقات البريد الإلكتروني

إذا كان التطبيق الخاص بك يحتوي على إطار لا يمكن تنشيطه عند إظهاره ، يمكنك تعيين الخاصية ShowActivated الخاصة به إلى أسلوب false قبل إجراء الاتصال Show لأول مرة . كنتيجة :

  • لا يتم تنشيط الإطار

  • لا يتم تشغيل جدث Activated .

  • الإطار الذي تم تنشيطه حالياً سيبقى نشطاً.

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

  • يتم تنشيط. الإطار

  • يتم تشغيل الحدث Activated .

  • الإطار الذي تم تنشيطه مسبقاً ، يتم إلغاء تنشيطه.

  • أحداث Deactivated و Activated الخاصة بالإطار يتم تشغيلها بالتالي بالشكل المتوقع استجابة لإجراءات المستخدم.

تنشيط الإطار

عند فتح إطار للمرة الأولى, يصبح الإطار نشطاً (ما لم يتم إظهاره بتعيين ShowActivated إلى false). الإطار النشط هو الإطار الذي يتم يقوم بالالتقاط الحالي لإدخال المستخدم مثل ضغطات المفاتيح أو نقرات الماوس . عندما يصبح الإطار نشطاً , فإنه يقوم بتشغيل الحدث Activated .

ملاحظةملاحظة

عند فتح الإطار للمرة الأولى, يتم تشغيل الأحداث Loaded و ContentRendered فقط بعد تشغيل الحدث Activated .بوضع هذا في الذاكرة ، فإن الإطار يمكن اعتباره بفاعلية مفتوح عند تشغيل ContentRendered .

بعد أن يصبح الإطار نشطاً ، فإن المستخدم يمكن تنشيط إطار آخر في نفس التطبيق أو تنشيط تطبيق آخر. عند حدوث ذلك، الإطار النشيط الحالي يتم إلغاء تنشيطه ويقوم بتشغيل الحدث Deactivated . وبالمثل، عندما يحدد المستخدم إطار حالي قد تم إلغاء تنشيطه ، يصبح الإطار نشطاً مرة أخرى و يتم تشغيل Activated .

سبب شائع واحد لمعالجة Activated و Deactivated هو لتمكين وتعطيل الوظائف التي يمكن تشغيلها فقط عندما يكون الإطار نشطاً. على سبيل المثال، بعض الإطارات تقوم بعرض المحتوى الغير تفاعلي الذي يتطلب إدخال مستخدم ثابت أو انتباه ، متضمناً الألعاب ومشغلات الفيديو. المثال التالي هو قارئ فيديو مبسط يوضح كيفية معالجة Activated و Deactivated لتطبيق هذا السلوك.

<Window
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.CustomMediaPlayerWindow"
    Activated="window_Activated"
    Deactivated="window_Deactivated">

    <!-- Media Player -->
    <MediaElement 
      Name="mediaElement" 
      Stretch="Fill" 
      LoadedBehavior="Manual" 
      Source="numbers.wmv" />

</Window>

Imports System ' EventArgs
Imports System.Windows ' Window

Namespace SDKSample
    Partial Public Class CustomMediaPlayerWindow
        Inherits Window
        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub window_Activated(ByVal sender As Object, ByVal e As EventArgs)
            ' Recommence playing media if window is activated
            Me.mediaElement.Play()
        End Sub

        Private Sub window_Deactivated(ByVal sender As Object, ByVal e As EventArgs)
            ' Pause playing if media is being played and window is deactivated
            Me.mediaElement.Pause()
        End Sub
    End Class
End Namespace
using System; // EventArgs
using System.Windows; // Window

namespace SDKSample
{
    public partial class CustomMediaPlayerWindow : Window
    {
        public CustomMediaPlayerWindow()
        {
            InitializeComponent();
        }

        void window_Activated(object sender, EventArgs e)
        {
            // Recommence playing media if window is activated
            this.mediaElement.Play();
        }

        void window_Deactivated(object sender, EventArgs e)
        {
            // Pause playing if media is being played and window is deactivated
            this.mediaElement.Pause();
        }
    }
}

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

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

ملاحظةملاحظة

يمكنك معالجة تنشيط نطاق-التطبيق باستخدام الأحداث Application.Activated و Application.Deactivated .

إغلاق إحدى النوافذ

تبدأ حياة الإطار الواردة تقترب إلى نهايتها عند إغلاق المستخدم له . يمكن إغلاق الإطار باستخدام عناصر في منطقة الغير عميل ، متضمناً غير ما يلي:

  • عنصر إغلاق الخاص بقائمة النظام.

  • الضغط على ALT+F4.

  • الضغط على الزر Close.

يمكنك توفير آليات إضافية إلى منطقة العميل لإغلاق الإطار و الذي الأكثر منها يتضمن ما يلي:

  • عنصر إنهاء في القائمة ملف، عادةً لإطارات التطبيق الرئيسي.

  • عنصر إغلاق في القائمة ملف، عادةً على إطار تطبيق ثانوي.

  • زر إغلاق "" ، عادةً على مربع حوار مشروط.

  • زر إغلاق "" ، عادةً على مربع حوار غير مشروط.

لإغلاق إطار استجابة إلى إحدى هذه الآليات المخصصة ، قد تحتاج لاستدعاء أسلوب Close . يقوم المثال التالي بتنفيذ القدرة على إغلاق الإطار باختيار إنهاء من القائمة ملف.

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.WindowWithFileExit">

  <Menu>
    <MenuItem Header="_File">
      <MenuItem Header="E_xit" Click="fileExitMenuItem_Click" />
    </MenuItem>
  </Menu>

</Window>

Imports System.Windows ' window, RoutedEventArgs

Namespace SDKSample
    Partial Public Class WindowWithFileExit
        Inherits System.Windows.Window
        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub fileExitMenuItem_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Close this window
            Me.Close()
        End Sub
    End Class
End Namespace
using System.Windows; // window, RoutedEventArgs

namespace SDKSample
{
    public partial class WindowWithFileExit : System.Windows.Window
    {
        public WindowWithFileExit()
        {
            InitializeComponent();
        }

        void fileExitMenuItem_Click(object sender, RoutedEventArgs e)
        {
            // Close this window
            this.Close();
        }
    }
}

عند إغلاق الإطار ، فإنه يقوم بتشغيل حدثين : Closing وClosed

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


Imports System ' EventArgs
Imports System.ComponentModel ' CancelEventArgs
Imports System.Windows ' window

Namespace VisualBasic
    Partial Public Class DataWindow
        Inherits Window
        ' Is data dirty
        Private isDataDirty As Boolean = False


...


        Private Sub DataWindow_Closing(ByVal sender As Object, ByVal e As CancelEventArgs)
            MessageBox.Show("Closing called")

            ' If data is dirty, notify user and ask for a response
            If Me.isDataDirty Then
                Dim msg As String = "Data is dirty. Close without saving?"
                Dim result As MessageBoxResult = MessageBox.Show(msg, "Data App", MessageBoxButton.YesNo, MessageBoxImage.Warning)
                If result = MessageBoxResult.No Then
                    ' If user doesn't want to close, cancel closure
                    e.Cancel = True
                End If
            End If
        End Sub
    End Class
End Namespace
using System; // EventArgs
using System.ComponentModel; // CancelEventArgs
using System.Windows; // window

namespace CSharp
{
    public partial class DataWindow : Window
    {
        // Is data dirty
        bool isDataDirty = false;


...


        void DataWindow_Closing(object sender, CancelEventArgs e)
        {
            MessageBox.Show("Closing called");

            // If data is dirty, notify user and ask for a response
            if (this.isDataDirty)
            {
                string msg = "Data is dirty. Close without saving?";
                MessageBoxResult result = 
                  MessageBox.Show(
                    msg, 
                    "Data App", 
                    MessageBoxButton.YesNo, 
                    MessageBoxImage.Warning);
                if (result == MessageBoxResult.No)
                {
                    // If user doesn't want to close, cancel closure
                    e.Cancel = true;
                }
            }
        }
    }
}

إن معالج الأحداث Closing ، يمكن تمريرCancelEventArgs له ، والذي يقوم بتنفيذ خاصية Boolean Cancel التي قمت بتعيينها إلى trueلمنع الإطار من الإغلاق.

إذا كان Closing لم تتم معالجته ، أو تمت معالجة ولكن لم يتم إلغاءه فإن الإطار سيتم إغلاقه. فقط قبل اغلاق الإطار بالفعل ، يتم تشغيل Closed . في هذه المرحلة ، لا يمكن منع الإطار من الإغلاق.

ملاحظةملاحظة

يمكن تكوين التطبيق لإيقاف التشغيل تلقائياً عند إما إغلاق التطبيق الرئيسي (راجع MainWindow) أو إغلاق الاطار الأخير.للمزيد من التفاصيل ، راجع ShutdownMode.

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

  • يقوم المستخدم بتسجيل الخروج أو إيقاف تشغيل Windows.

  • إغلاق الإطار المالك (راجع Owner).

  • اطار التطبيق الرئيسي يتم اغلاقه و ShutdownMode هو OnMainWindowClose.

  • يتم استدعاء Shutdown.

ملاحظةملاحظة

لا يمكن اعادة فتح اطار بعد أن يتم إغلاقه.

أحداث عمر الإطار

يبين الرسم التوضيحي التالي تسلسل الأحداث الرئيسية في عمر الإطار.

مدة بقاء النافذة

يبين الرسم التوضيحي التالي تتابع الأحداث الرئيسية في عمر الإطار التي تظهر بدون التنشيط ( ShowActivated يتم تعيينه إلى false قبل ظهور الإطار).

مدة بقاء النافذة (Window.ShowActivated = False)

موقع الإطار

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

يمكنك أيضاً تحديد الموقع الأولي لــ Window عندما يظهر أولاً بواسطة تعيين الخاصية WindowStartupLocation بإحدى قيم تعداد WindowStartupLocation التالية :

إذا كان قد تم تحديد موقع بدء التشغيل كـ Manual ، و خصائص Left و Top لم يتم تعيينها ، فإن Window سيسأل Windowsعن موقع يظهر فيه

الإطارات العلوية و ترتيب Z

إلى جانب الحاجة إلى موقع س و ص ، فإن الإطار يحتوي أيضاً على موقع على البعد ع الذي يحدد الموضع العمودي الخاص به مع الإشارة إلى الإطارات الأخرى. ويعرف هذا بالإطار من الترتيب ع Z , و هناك نوعان: الترتيب ع العادي و الترتيب ع العلوي موقع الإطار في ترتيب ع العادي يتم تحديده عن طريق ما إذا كان نشط حاليًا أم لا. بشكل افتراضي، فإن الإطار موجود في ترتيب ع العادي . موقع الإطار في ترتيب ع العلوي يتم تحديده عن طريق ما إذا كان نشط حاليًا أم لا. علاوة على ذلك، فإن الإطارات في ترتيب ع العلوي تكون دوماً موجودة أعلى الإطارات في ترتيب ع العادي. الإطار يقع في ترتيب ع الأعلى بواسطة إعداد الخاصية Topmost الخاصة به إلى true.

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    Topmost="True">


...


</Window>

داخل كل ترتيب ع ، فإن الإطار النشط حالياً يظهر أعلى كافة الإطارات الأخرى في نفس ترتيب ع.

حجم النافذة

بالإضافة إلى احتواء إلى موقع سطح المكتب, فإن الإطار يحتوي على حجم يتحدد بواسطة العديد من الخصائص بما في ذلك خصائص العرض والارتفاع و المتنوعة و SizeToContent.

يتم استخدام MinWidth ،Width ، وMaxWidth لإدارة نطاق أبعاد العرض و الذي يمكن أن يحتوي عليه الإطار أثناء فترة عمله ،و يتم تكوينها كما هو موضح في المثال التالي

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    MinWidth="300" Width="400" MaxWidth="500">


...


</Window>

ارتفاع الاطار يتم ادارته عن طريق MinHeight ، Height ، و MaxHeight, و يتم تكوينها كما هو موضح في المثال التالي

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    MinHeight="300" Height="400" MaxHeight="500">


...


</Window>

لأن قيم العرض وقيم الارتفاع المتنوعة كل منهما تقوم تحديد نطاق, من الممكن للعرض وللارتفاع لإطار قابل للتحجيم أن تكونا في أي مكان ضمن النطاق المعيّن الخاص بالبعد المعين. للكشف عن الارتفاع والعرض الحالي الخاص به ، افحص ActualWidth و ActualHeight بالترتيب.

إذا كنت تريد عرض وارتفاع الإطار لمعرفة الحجم الذي يوافق حجم محتوى الإطار ، يمكنك استخدام خاصية SizeToContent ، التي تحتوي على القيم التالية:

  • Manual. لا يؤثر (افتراضي).

  • Width. احتواء إلى محتوى العرض، والذي له نفس التأثير عند تعيين كلا MinWidthو MaxWidthإلى عرض محتوى.

  • Height. احتواء إلى المحتوى الارتفاع، والذي له نفس التأثير عند تعيين كلا MinHeightو MaxHeightإلى ارتفاع المحتويات.

  • WidthAndHeight. احتواء إلى محتوى العرض والارتفاع، الذي له نفس التأثير عند تعيين كلا MinHeightو MaxHeightإلى ارتفاع المحتوى، وإعداد كل من MinWidthو MaxWidthإلى عرض محتوى.

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

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    SizeToContent="WidthAndHeight">


...


</Window>

ترتيب الأسبقية لخصائص التحجيم

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

للحصول على خصائص الارتفاع

  1. FrameworkElement.MinHeight >

  2. FrameworkElement.MaxHeight >

  3. SizeToContent.Height/SizeToContent.WidthAndHeight >

  4. FrameworkElement.Height

للحصول على خصائص العرض:

  1. FrameworkElement.MinWidth >

  2. FrameworkElement.MaxWidth >

  3. SizeToContent.Width/SizeToContent.WidthAndHeight >

  4. FrameworkElement.Width

ترتيب الأسبقية يمكنه أيضاً تحديد حجم أحد الإطارات عندما يكون مكبر ، الذي تتم إدارته عن طريق الخاصية WindowState .

حالة الاطار

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

إطار بحالة تصغير يقوم بالطي إلى زر شريط المهام الخاص به إذا ShowInTaskbar قد تم تعيينه إلى true ؛ وإلا، فسيقوم بالطي إلى اصغر حجم ممكن كما سيقوم بإعادة تعيين موقع نفسه إلى الركن الأيمن السفلي من سطح المكتب. و لا نوع من الإطارات المصغرة يمكن تغيير حجمه باستخدام حد أو مؤشر تغيير الحجم ، على الرغم من أن الإطارات المصغرة التي لم يتم إظهارها في شريط المهام ويمكن سحبها حول سطح المكتب.

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

ملاحظةملاحظة

قيم خصائص Top ، Left ، Width ، و Height الخاصة بالإطار دوماً تمثل قيم الاطار العادي ، حتى عندما يتم تكبير الإطار أو تصغيره حالياً.

يمكن تكوين حالة إطار بواسطة إعداد خاصية WindowState الخاصة به ، والتي يمكن أن يكون واحداً من قيم تعداد WindowState التالية :

المثال التالي يعرض كيفية إنشاء إطار يظهر كمكبر عند فتحه.

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    WindowState="Maximized">


...


</Window>

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

مظهر الاطار

يمكنك تغيير مظهر منطقة المحتويات الخاصة بالاطار عن طريق إضافة محتوى مختص بالاطار عليها، مثل أزرار التسميات ومربعات النص. لتكوين منطقة غير العميل , Window يوفر العديد من الخصائص التي تتضمن Icon لتعيين رمز الإطار و Title لتعيين العنوان الخاص به.

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

يشتمل هذا القسم على الأقسام الفرعية التالية.

  • وضع تغيير حجم
  • أنماط النوافذ
  • وجود شريط المهام

وضع تغيير حجم

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

يمكنك تكوين كيفية تغيير حجم إطار بواسطة إعداد خاصية ResizeMode الخاصة به, والذي من الممكن أن يكون واحداً من قيم التعداد ResizeMode التالية :

كما مع WindowStyle ، فإن وضع تغيير الحجم الخاص بإطار غير محبب أن يقوم بتغيير أثناء عمره مما يعني أنك ستقوم على الأرجح بتعيينه من العلامات XAML .

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ResizeMode="CanResizeWithGrip">


...


</Window>

لاحظ إنه يمكنك الكشف عن ما إذا كان الاطار قد تم تكبيره أو تصغيره أو استعادته خلال اختبار خاصية WindowState .

أنماط النوافذ

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

للتحكم في أي نوع من الحد يأخذه الإطار ، تقوم بتعيين خاصية WindowStyle الخاصة به بإحدى القيم التالية الخاصة بالتعداد WindowStyle :

تأثير أنماط الاطارات تلك موضحة في الشكل التالي.

أنماط النوافذ

يمكنك تعيين WindowStyle باستخدام إما العلامات XAML أو تعليمات برمجية; لأنه من غير المحبب التغيير أثناء فترة حياة الإطار ، الأرجح سوف تقوم بتكوينه باستخدام العلامات XAML .

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    WindowStyle="ToolWindow">


...


</Window>

نمط اطار غير مستطيل

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

على سبيل المثال، ضع في الاعتبار إطار فقاعة الكلام الموضح في الشكل التالي.

نافذة غير مستطيلة

هذا النوع من إطار يمكن انشاءه بواسطة إعداد خاصية WindowStyle إلى None ، و باستخدام الدعم الخاص الذي يمتلكه Window للشفافية.

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    WindowStyle="None"
    AllowsTransparency="True"
    Background="Transparent">


...


</Window>

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

وجود شريط المهام

يتضمن المظهر الافتراضي للإطار زر شريط مهام, مثل الظاهر في الشكل التالي.

نافذة بها زر لشريط مهام

بعض أنواع الاطارات لا تحتوي زر شريط مهام مثل مربعات الرسائل ومربعات الحوار (راجع نظرة عامة حول مربعات الحوار). يمكنك التحكم في ما إذا كان زر شريط المهام الخاص بالإطار سيتم إظهاره بواسطة إعداد خاصية ShowInTaskbar ( true بشكل افتراضي).

<Window 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ShowInTaskbar="False">


...


</Window>

اعتبارات الأمان

Window يتطلب إذن الأمان UnmanagedCode حتى يتم إنشاء مثيل خاص به . للتطبيقات المثبتة و العاملة من الجهاز المحلي ، يقع هذا ضمن مجموعة الأذونات الممنوحة إلى التطبيق.

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

بالإضافة إلى ذلك، تطبيقات XBAP لا يمكنه إظهار الإطارات أو مربعات الحوار بشكل افتراضي . للحصول على مناقشة على اعتبارات الأمن الخاصة بالتطبيقات المستقلة ، راجع استراتيجية أمان WPF - أمان النظام الأساسي.

أنواع أخرى من الاطارات

NavigationWindow هو إطار الذي تم تصميمه لاستضافة محتوى قابل للتنقل. لمزيد من المعلومات، راجع نظرة عامة حول التنقل.

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

راجع أيضًا:

المرجع

Window

MessageBox

NavigationWindow

Application

المبادئ

نظرة عامة حول مربعات الحوار

إنشاء تطبيق WPF (WPF)