نظرة عامة حول إدارة التطبيق

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

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

  • فئة التطبيق.
  • تعريف التطبيق
  • الحصول على التطبيق الحالي
  • مدة بقاء التطبيق
  • خدمات تطبيق أخرى
  • موضوعات ذات صلة

فئة التطبيق.

يتكون التطبيق من عناصر خاصة بالتطبيق بما في ذلك واجهة المستخدم (UI), منطق تسلسل العمل، منطق الوصول إلى البيانات، عناصر التحكم، و البيانات. تختلف هذه العناصر عادةً من تطبيق إلى التالي. مع ذلك، تميل كافة التطبيقات لمشاركة مجموعة شائعة من الوظائف التي تسهّل تنفيذ التطبيق و إدارته في WPF, يتم تغليف هذه الوظيفة الخاصة بالتطبيق الشائعة بواسطة فئة Application التي توفر الخدمات التالية:

  • إنشاء و إدارة البنية الأساسية للتطبيق الشائعة.

  • تعقب و تفاعل مع مدة بقاء التطبيق.

  • استرداد و معالجة معلمات سطر الأوامر.

  • مشاركة خصائص نطاق التطبيق و موارد .

  • الكشف عن و الاستجابة إلى الاستثناءات غير المعالجة.

  • إرجاع رموز الإنهاء.

  • إدارة الإطارات في التطبيقات المستقل(راجع نظرة عامة حول Windows WPF).

  • التعقب و إدارة التنقل (راجع نظرة عامة حول التنقل).

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

تعريف التطبيق

تعريف تطبيق WPF هو فئة مشتقة من Application و يتم تكوينها بإعداد Microsoft build engine (MSBuild) خاص.

تنفيذ تعريف التطبيق

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

يظهر المثال التالي كيفية تنفيذ تعريف تطبيق خاص باستخدام كلاً من العلامات و التعليمات البرمجية الخلفية:

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

Imports Microsoft.VisualBasic
Imports System.Windows ' Application

Namespace SDKSample
    Partial Public Class App
        Inherits Application
    End Class
End Namespace
using System.Windows;  // Application

namespace SDKSample
{
    public partial class App : Application { }
}

للسماح لملف العلامات و ملف التعليمات البرمجية الخلفية بالعمل معاً يجب أن يحدث التالي:

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

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

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

عند إنشاء مشروع تطبيق WPF جديد أو مشروع تطبيق مستعرض WPF باستخدام Microsoft Visual Studio ، يتم تضمين بشكل افتراضي تعريف تطبيق و يتم تعريفه باستخدام العلامات و التعليمات البرمجية الخلفية.

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

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

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

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

<Project 
  DefaultTargets="Build"
  xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <ApplicationDefinition Include="App.xaml" />
  <Compile Include="App.xaml.cs" />
  ...
</Project>

لأن التعليمات البرمجية الخلفية تحتوي على التعليمات البرمجية، يتم وضع علامة أنها عنصر MSBuild Compile العنصر, كما هو عادي.

التطبيق لتكوينات MSBuild إلى العلامات و ملفات التعليمات البرمجية الخلفية لتعريف تطبيق تتسبب أن يقوم MSBuild بإنشاء تعليمات برمجية كما يلي:


Imports Microsoft.VisualBasic
Imports System ' STAThread
Imports System.Windows ' Application

Namespace SDKSample
    Public Class App
        Inherits Application
        Public Sub New()
        End Sub
        <STAThread>
        Public Shared Sub Main()
            ' Create new instance of application subclass
            Dim app As New App()

            ' Code to register events and set properties that were
            ' defined in XAML in the application definition
            app.InitializeComponent()

            ' Start running the application
            app.Run()
        End Sub

        Public Sub InitializeComponent()


...


        End Sub
    End Class
End Namespace
using System; // STAThread
using System.Windows; // Application

namespace SDKSample
{
    public class App : Application
    {
        public App() { }
        [STAThread]
        public static void Main()
        {
            // Create new instance of application subclass
            App app = new App();

            // Code to register events and set properties that were
            // defined in XAML in the application definition
            app.InitializeComponent();

            // Start running the application
            app.Run();
        }

        public void InitializeComponent()
        {


...


        }
    }
}

التعليمات البرمجية الناتجة تقوى تعريف التطبيق مع تعليمات برمجية البنية التحتية الإضافية التي تتضمن أسلوب نقطة إدخال Main. سمة STAThreadAttribute يتم تطبيقها إلى أسلوب Main للإشارة إلى أن مؤشر ترابط واجهة المستخدم الرئيسي لتطبيق WPF هو مؤشر ترابط STA المطلوب لتطبيقات WPF. عندما يتم استدعائه يقوم Main بإنشاء مثيل جديد من App قبل استدعاء أسلوب InitializeComponent لتسجيل الأحداث و تعيين الخصائص التي يتم تنفيذها في العلامات. لأنه يتم إنشاء InitializeComponent من أجلك, لا تحتاج إلى استدعاء بشكل صريح InitializeComponent من تعريف تطبيق كما تفعل مع تطبيقات Page و Window. في النهاية، يتم استدعاء أسلوب Run لبدء تشغيل التطبيق.

الحصول على التطبيق الحالي

لأن الخدمات من فئة Application مشتركة عبر تطبيق، يمكن أن يكون هناك مثيل واحد فقط من فئة Application لكل AppDomain. لفرض هذا, فئة Application يتم تطبيقها كفئة نوع مفرد (راجع تطبيق فريد في C#‎)، الذي يقوم بإنشاء مثيل واحد من نفسه كما يوفر مشاركة الوصول إليه بخاصية static Current.

التعليمات البرمجية التالية توضح كيفية الحصول على مرجع إلى كائن Application من AppDomain الحالي.

            ' Get current application
            Dim current As Application = App.Current
// Get current application
Application current = App.Current;

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

            ' Get strongly-typed current application
            Dim appCurrent As App = CType(App.Current, App)
// Get strongly-typed current application
App app = (App)App.Current;

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

عندما يكمل Application عمل التهيئة الخاص به, تبدأ مدة بقائه حقاً.

مدة بقاء التطبيق

مدة بقاء تطبيق WPF يتم وضع علامة عليها بواسطة العديد من الأحداث التي يتم تشغيل الحدث من قبل Application لإعلامك عندما يتم بدء التطبيق الخاص بك, تنشيطه و إلغاء تنشيطه, و إيقاف تشغيله.

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

  • شاشة البداية
  • بدء تشغيل تطبيق
  • إظهار واجهة المستخدم
  • معالجة وسيطات خط الأمر
  • تنشيط و إلغاء تنشيط التطبيق
  • تطبيق متوقف عن التشغيل
  • الاستثناءات غير المعالجة.
  • أحداث مدة بقاء التطبيق

شاشة البداية

بدء تشغيل في .NET Framework 3.5 SP1، يمكنك تحديد صورة لاستخدامها في إطار "بدء التشغيل"، أو شاشة البداية . فئة SplashScreen تجعل من السهل عرض إطار بدء التشغيل أثناء تحميل التطبيق الخاص بك. يتم إنشاء إطار SplashScreen و عرضه قبل استدعاء Run. للمزيد من المعلومات، راجع وقت بدء تشغيل التطبيق وكيفية القيام بما يلي: إضافة شاشة البداية إلى تطبيق WPF.

بدء تشغيل تطبيق

بعد استدعاء Run و تهيئة التطبيق, يكون التطبيق جاهزاً للتشغيل. هذا اللحظة تصبح مميزة عندما يتم رفع حدث Startup:


Imports Microsoft.VisualBasic
Imports System.Windows ' Application, StartupEventArgs, WindowState

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Application is running


...


        End Sub
    End Class
End Namespace
using System.Windows; // Application, StartupEventArgs, WindowState

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Application is running


...


        }
    }
}

عند هذه النقطة في مدة حياة أحد التطبيقات, الشيء الأكثر شيوعاً لفعله هو إظهار واجهة المستخدم.

إظهار واجهة المستخدم

معظم تطبيقات Windows المستقلة تفتح Window عند قيامهم ببدء التشغيل. معالج حدث Startup هو موقع واحد من حيث يمكن إجراء هذا, كما هو موضّح بواسطة التعليمات البرمجية التالية.

<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" />

Imports Microsoft.VisualBasic
Imports System.Windows ' Application, StartupEventArgs

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Open a window
            Dim window As New MainWindow()
            window.Show()
        End Sub
    End Class
End Namespace
using System.Windows; // Application, StartupEventArgs

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Open a window
            MainWindow window = new MainWindow();
            window.Show();
        }
    }
}
ملاحظةملاحظة

Window الأول الذي يتم إنشاء مثيل منه في تطبيق مستقل يصبح إطار التطبيق الرئيسي بشكل افتراضي.كائن Window يتم الإشارة إليه بواسطة خاصية Application.MainWindow.القيمة من خاصية MainWindow يمكن تغييرها برمجياً إذا إطار آخر غير الأول قام بإنشاء مثيل Window يجب أن يكون الإطار الرئيسي.

عند يبدأ XBAPلأول مرة فإنه فسوف غالبًا ينتقل إلى Page. يظهر هذا في التعليمات البرمجية التالية.

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

Imports System ' Uri, UriKind, EventArgs, Console
Imports System.Windows ' Application, StartupEventArgs
Imports System.Windows.Navigation ' NavigationWindow

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            CType(Me.MainWindow, NavigationWindow).Navigate(New Uri("HomePage.xaml", UriKind.Relative))
        End Sub
    End Class
End Namespace
using System; // Uri, UriKind, EventArgs, Console
using System.Windows; // Application, StartupEventArgs
using System.Windows.Navigation; // NavigationWindow

namespace SDKSample
{
    public partial class App : Application
    {        
        void App_Startup(object sender, StartupEventArgs e)
        {
            ((NavigationWindow)this.MainWindow).Navigate(new Uri("HomePage.xaml", UriKind.Relative));
        }
    }
}

إذا قمت بمعالجة Startup لمجرد فتح Window أو الانتقال إلى Page، يمكنك تعيين سمة StartupUri في العلامات بدلاً من ذلك.

يظهر المثال التالي كيفية استخدام StartupUri من تطبيق يمكن تشغيله منفرداً لفتح Window.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="MainWindow.xaml" />

يوضح المثال التالي كيفية استخدام StartupUri من XBAP للتنقل إلى Page.

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="HomePage.xaml" />

هذه العلامات لها نفس تأثير التعليمات البرمجية السابقة لفتح إطار.

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

للحصول على مزيد من المعلومات حول التنقل, راجع نظرة عامة حول التنقل.

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

معالجة وسيطات خط الأمر

في Windows، يمكن أن يتم تشغيل تطبيقات مستقلة من موجه الأوامر أو سطح المكتب. في كلتا الحالتين, يمكن تمرير وسيطات سطر الأمر إلى التطبيق. يظهر المثال التالي تطبيق تم تشغيله بوسيطة سطر أمر مفرد "/ StartMinimized":

wpfapplication.exe /StartMinimized

أثناء تهيئة التطبيق, يقوم WPF باسترداد وسائط سطر الأوامر من نظام التشغيل و ينقلها إلى معالج حدث Startup عبر خاصية Args من معلمة StartupEventArgs. يمكنك استرداد و إعادة تخزين وسيطات سطر الأوامر باستخدام التعليمات البرمجية مثل التالي.

<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" />

Imports Microsoft.VisualBasic
Imports System.Windows ' Application, StartupEventArgs, WindowState

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Application is running
            ' Process command line args
            Dim startMinimized As Boolean = False
            Dim i As Integer = 0
            Do While i <> e.Args.Length
                If e.Args(i) = "/StartMinimized" Then
                    startMinimized = True
                End If
                i += 1
            Loop

            ' Create main application window, starting minimized if specified
            Dim mainWindow As New MainWindow()
            If startMinimized Then
                mainWindow.WindowState = WindowState.Minimized
            End If
            mainWindow.Show()
        End Sub
    End Class
End Namespace
using System.Windows; // Application, StartupEventArgs, WindowState

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Application is running
            // Process command line args
            bool startMinimized = false;
            for (int i = 0; i != e.Args.Length; ++i)
            {
                if (e.Args[i] == "/StartMinimized")
                {
                    startMinimized = true;
                }
            }

            // Create main application window, starting minimized if specified
            MainWindow mainWindow = new MainWindow();
            if (startMinimized)
            {
                mainWindow.WindowState = WindowState.Minimized;
            }
            mainWindow.Show();
        }
    }
}

تعالج التعليمات البرمجية Startup للتحقق مما إذا كان تم توفير وسيطة سطر الأوامر /StartMinimized; إذا كان الأمر كذلك، يقوم بفتح إطار الرئيسي مع WindowState من Minimized. لاحظ أنه بسبب أنه يجب تعيين خاصية WindowState برمجياً ، Window الرئيسي يجب فتحه بشكل صريح في التعليمات البرمجية.

تطبيقات XBAP لا يمكنه استرداد و معالجة وسائط سطر الأوامر لأنهم يتم تشغيلهم باستخدام نشر ClickOnce (راجع نشر أحد تطبيقات WPF (WPF)). مع ذلك، يمكنهم استرداد و معالجة معلمات سلسلة الاستعلام من URLs التي يتم استخدامهم لتشغيلهم.

تنشيط و إلغاء تنشيط التطبيق

Windows يسمح للمستخدمين بالتبديل بين التطبيقات. الطريقة الأكثر شيوعًا لاستخدام تركيبة المفاتيح ALT + TAB. يمكن تبديل إلى تطبيق فقط إذا كان له Window مرئي الذي يمكن للمستخدم تحديده. Window المحدد حالياً هو الإطار النشط (يعرف أيضاً كإطار المقدمة) و هو Window الذي يتلقى إدخال المستخدم. التطبيق مع الإطار النشط هو التطبيق النشط (أو التطبيق المقدمة ). التطبيق يصبح تطبيق نشط في الحالات التالية:

  • يتم تشغيله و يظهر Window.

  • المستخدم يبدل من تطبيق آخر عن طريق تحديد Window في التطبيق.

يمكنك الكشف عندما يكون التطبيق غير نشط بواسطة معالجة حدث Application.Activated.

كذلك، يمكن أن يصبح أحد تطبيقات غير نشط في الحالات التالية:

  • يقوم المستخدم بالتبديل إلى تطبيق آخر من الحالي.

  • عند إيقاف تشغيل التطبيق.

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

التعليمات البرمجية التالية توضح كيفية معالجة أحداث Activated و Deactivated لتحديد ما إذا كان التطبيق نشط.

<Application 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  StartupUri="MainWindow.xaml"
  Activated="App_Activated" 
  Deactivated="App_Deactivated" />

Imports Microsoft.VisualBasic
Imports System ' EventArgs
Imports System.Windows ' Application

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private isApplicationActive As Boolean

        Private Sub App_Activated(ByVal sender As Object, ByVal e As EventArgs)
            ' Application activated
            Me.isApplicationActive = True
        End Sub

        Private Sub App_Deactivated(ByVal sender As Object, ByVal e As EventArgs)
            ' Application deactivated
            Me.isApplicationActive = False
        End Sub
    End Class
End Namespace
using System; // EventArgs
using System.Windows; // Application

namespace SDKSample
{
    public partial class App : Application
    {
        bool isApplicationActive;

        void App_Activated(object sender, EventArgs e)
        {
            // Application activated
            this.isApplicationActive = true;
        }

        void App_Deactivated(object sender, EventArgs e)
        {
            // Application deactivated
            this.isApplicationActive = false;
        }
    }
}

Window يمكن أيضاً تنشيطه و إلغاء تنشيطه. لمزيد من المعلومات، راجع Window.Activated و Window.Deactivated .

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

لا يتم رفع أي من Application.Activated أو Application.Deactivated لـ تطبيقات XBAP.

تطبيق متوقف عن التشغيل

تنتهي مدة بقاء التطبيق عندما يتم إيقاف تشغيله، و الذي يمكن أن يحدث للأسباب التالية:

  • يغلق المستخدم كل Window.

  • يغلق المستخدم Window الرئيسي.

  • ينهي المستخدم جلسة عمل Windows عن طريق تسجيل الخروج أو إيقاف التشغيل.

  • الشرط الخاص بالتطبيق يتم إيفائه.

للمساعدة في إدارة إيقاف تشغيل التطبيق, يوفر Application أسلوب Shutdown, خاصية ShutdownMode، و أحداث SessionEnding و Exit.

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

Shutdown يمكن استدعائه فقط من التطبيقات التي تملك UIPermission.تطبيقاتWPF المستقلة دوماً لها هذا الإذن.مع ذلك، تطبيقات XBAP الذي هو قيد التشغيل في ‏‫آلية تحديد الصلاحيات‬ أمان حماية الثقة الجزئية لمنطقة إنترنت لا يفعل هذا.

الوضع متوقَّف عن التشغيل

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

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

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

عندما يكون لديك شروط إيقاف التشغيل الخاصة بالتطبيق, قم بتعيين ShutdownMode إلى OnExplicitShutdown. في هذه الحالة، تكون مسؤوليتك إيقاف تشغيل التطبيق و ذلك عن طريق استدعاء بشكل صريح أسلوب Shutdown; و إلا، التطبيق الخاص بك سيتابع التشغيل حتى إذا تم إغلاق كافة الإطارات. لاحظ أن Shutdown يتم استدعائه ضمنيًا عندما يكون ShutdownMode إما OnLastWindowClose أو OnMainWindowClose.

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

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

إنهاء جلسة عمل

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

  • تسجيل الخروج

  • إيقاف التشغيل

  • إعادة تشغيل

  • السبات

لاكتشاف عندما تنتهي جلسة عمل Windows, يمكنك معالجة حدث SessionEnding كما هو موضح في المثال التالي.

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

Imports Microsoft.VisualBasic
Imports System.Windows ' Application, SessionEndingCancelEventArgs, MessageBox, MessageBoxResult, MessageBoxButton

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_SessionEnding(ByVal sender As Object, ByVal e As SessionEndingCancelEventArgs)
            ' Ask the user if they want to allow the session to end
            Dim msg As String = String.Format("{0}. End session?", e.ReasonSessionEnding)
            Dim result As MessageBoxResult = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo)

            ' End session, if specified
            If result = MessageBoxResult.No Then
                e.Cancel = True
            End If
        End Sub
    End Class
End Namespace
using System.Windows; // Application, SessionEndingCancelEventArgs, MessageBox, MessageBoxResult, MessageBoxButton

namespace SDKSample
{
    public partial class App : Application
    {
        void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
        {
            // Ask the user if they want to allow the session to end
            string msg = string.Format("{0}. End session?", e.ReasonSessionEnding);
            MessageBoxResult result = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo);

            // End session, if specified
            if (result == MessageBoxResult.No)
            {
                e.Cancel = true;
            }
        }
    }
}

في هذا المثال، تفحص التعليمات البرمجية بحثاً خاصية ReasonSessionEnding لكيفية انتهاء جلسة عمل Windows. تستخدم هذه القيمة لعرض رسالة تأكيد إلى المستخدم. إذا كان المستخدم لا يريد أن تنتهي جلسة العمل، تقوم التعليمات البرمجية بتعيين Cancel إلى true لمنع جلسة عمل Windows من الانتهاء.

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

لا يتم رفع SessionEnding لـتطبيقات XBAP.

إنهاء

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

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="MainWindow.xaml" 
    Startup="App_Startup" 
    Exit="App_Exit">


...


</Application>
Imports System.IO ' StreamReader, FileMode
Imports System.IO.IsolatedStorage ' IsolatedStorageFile, IsolatedStorageFileStream

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private filename As String = "App.txt"



...


        Private Sub App_Exit(ByVal sender As Object, ByVal e As ExitEventArgs)
            ' Persist application-scope property to isolated storage
            Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForDomain()
            Using stream As New IsolatedStorageFileStream(filename, FileMode.Create, storage)
            Using writer As New StreamWriter(stream)
                ' Persist each application-scope property individually
                For Each key As String In Me.Properties.Keys
                    writer.WriteLine("{0},{1}", key, Me.Properties(key))
                Next key
            End Using
            End Using
        End Sub
    End Class
End Namespace
using System.Windows; // Application, StartupEventArgs
using System.IO; // StreamReader, FileMode
using System.IO.IsolatedStorage; // IsolatedStorageFile, IsolatedStorageFileStream

namespace SDKSample
{
    public partial class App : Application
    {
        string filename = "App.txt";



...


        private void App_Exit(object sender, ExitEventArgs e)
        {
            // Persist application-scope property to isolated storage
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForDomain();
            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filename, FileMode.Create, storage))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // Persist each application-scope property individually
                foreach (string key in this.Properties.Keys)
                {
                    writer.WriteLine("{0},{1}", key, this.Properties[key]);
                }
            }
        }
    }
}

للمثال الكامل، راجع كيفية القيام بما يلي: استمرار واستعادة خصائص نطاق التطبيق عبر جلسات عمل التطبيق.

Exit يمكن معالجته بواسطة التطبيقات المستقلة و تطبيقات XBAP. ل تطبيقات XBAP، يتم رفع Exit في الحالات التالية:

  • XBAP يتم الانتقال بعيدًا عنها.

  • في برنامج Internet Explorer 7, عندما يتم غلق علامة التبويب التي تستضيف XBAP.

  • عند إغلاق المستعرض.

رمز الإنهاء

يتم غالبًا تشغيل التطبيقات بواسطة نظام تشغيل استجابة إلى طلب المستخدم. مع ذلك، يمكن تشغيل أحد التطبيقات بواسطة تطبيق آخر للقيام ببعض المهام المحددة. عند إيقاف تشغيل التطبيق المشغل, قد يحتاج التطبيق المشغل إلى معرفة الشرط الذي عنده يتم إيقاف تشغيله. في هذه الحالات، يسمح Windows للتطبيقات بإرجاع تعليمات برمجية خروج التطبيق عند إيقاف التشغيل. افتراضياً، تطبيقات WPF ترجع قيمة تعليمات برمجية الخروج 0.

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

عند التصحيح من Visual Studio ، يتم عرض تعليمات برمجية خروج التطبيق في إطار الناتج عند إيقاف تشغيل التطبيق, في رسالة التي تشبه التالي:

The program '[5340] AWPFApp.vshost.exe: Managed' has exited with code 0 (0x0).

فتح إطار إخراج بالنقر على إخراج من قائمة عرض.

لتغيير تعليمات برمجية الخروج، يمكنك استدعاء زيادة تحميل Shutdown(Int32)، الذي يقبل أن وسيطة عدد صحيح تصبح تعليمات برمجية الخروج:

' Shutdown and return a non-default exit code
Application.Current.Shutdown(-1)
// Shutdown and return a non-default exit code
Application.Current.Shutdown(-1);

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

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

يمكنك تعيين تعليمات برمجية الخروج في كل من التطبيقات المستقلة و تطبيقات XBAP.ومع ذلك، يتم تجاهل قيمة تعليمات برمجية الإنهاء لتطبيقات XBAP.

الاستثناءات غير المعالجة.

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

إعلام باستثناء لم تتم معالجته

من وجهة نظر خبرة المستخدم, من الأفضل من أجل تطبيق تجنب هذا السلوك الافتراضي بالقيام ببعض أو كافة الإجراءات التالية:

  • عرض معلومات مألوفة بالنسبة للمستخدم.

  • محاولة الاحتفاظ بالتطبيق قيد التشغيل.

  • تسجيل مبيانات الاستثناء بطريقة مفصلة و مألوفة للمطور في سجل أحداث Windows.

تنفيذ هذا الدعم يعتمد على إمكانية الكشف عن الاستثناءات غير المعالجة وهو ما يتم رفع حدث DispatcherUnhandledException بسببه.

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

Imports Microsoft.VisualBasic
Imports System.Windows ' Application
Imports System.Windows.Threading ' DispatcherUnhandledExceptionEventArgs

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_DispatcherUnhandledException(ByVal sender As Object, ByVal e As DispatcherUnhandledExceptionEventArgs)
            ' Process unhandled exception


...


            ' Prevent default unhandled exception processing
            e.Handled = True
        End Sub
    End Class
End Namespace
using System.Windows; // Application
using System.Windows.Threading; // DispatcherUnhandledExceptionEventArgs

namespace SDKSample
{
    public partial class App : Application
    {
        void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            // Process unhandled exception


...


            // Prevent default unhandled exception processing
            e.Handled = true;
        }
    }
}

معالج حدث DispatcherUnhandledException يمرر إليه معلمة DispatcherUnhandledExceptionEventArgs التي تحتوي على معلومات سياقية فيما يتعلق بالاستثناء غير المعالَج بما في ذلك الاستثناء نفسه ( DispatcherUnhandledExceptionEventArgs.Exception). يمكنك استخدام هذه المعلومات لتحديد كيفية معالجة الاستثناء.

عند معالجة DispatcherUnhandledException ، يجب عليك تعيين خاصية DispatcherUnhandledExceptionEventArgs.Handled إلى true؛ وإلا، WPF لا يزال يعتبر أن الاستثناء غير معالج ثم يعود إلى السلوك الافتراضي الذي تم وصفه سابقاً. إذا تم رفع استثناء غير معالج و لم يتم معالجة حدث DispatcherUnhandledException أو تم معالجته و تم تعيين Handled إلى false ، يتم إيقاف تشغيل التطبيق فورًا. علاوة على ذلك، لا يتم رفع أحداث Application أخري. بالتالي تحتاج إلى معالجة DispatcherUnhandledException إذا كان التطبيق الخاص بك يحتوي على التعليمات البرمجية التي يجب أن تعمل قبل إيقاف تشغيل التطبيق.

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

أحداث مدة بقاء التطبيق

التطبيقات المستقلة و تطبيقات XBAP ليس لديهم نفس الأعمار تماماً. الشكل الآتي يوضح الأحداث الرئيسية في عمر التطبيق المستقل و يظهر التسلسل حيث يتم رفعهم.

تطبيق يمكن تشغيله منفردًا - أحداث كائنات التطبيق

بالمثل، يوضح الرسم التالي الأحداث الرئيسية في مدة بقاء XBAP، و يظهر التسلسل حيث يتم رفعهم.

XBAP - أحداث كائنات التطبيق

خدمات تطبيق أخرى

بالإضافة إلى إدارة مدة بقاء التطبيق, يوفر Application خدمات التي تتضمن ما يلي:

  • خصائص خاصة بالتطبيق مشتركة

  • موارد خاصة بالتطبيق مشتركة

  • مورد التطبيق, المحتوى و ملفات بيانات موقع الأصل.

  • إدارة نافذة

  • إدارة التنقل

خصائص خاصة بالتطبيق مشتركة

يوفر التطبيق خاصية Properties لعرض حالة التي يمكن مشاركتها عبر اتساع من التطبيقات. يوفر التالي مثال لاستخدام Properties:

      ' Set an application-scope property with a custom type
      Dim customType As New CustomType()
      Application.Current.Properties("CustomType") = customType


...


      ' Get an application-scope property
      ' NOTE: Need to convert since Application.Properties is a dictionary of System.Object
      Dim customType As CustomType = CType(Application.Current.Properties("CustomType"), CustomType)
// Set an application-scope property with a custom type
CustomType customType = new CustomType();
Application.Current.Properties["CustomType"] = customType;


...


// Get an application-scope property
// NOTE: Need to convert since Application.Properties is a dictionary of System.Object
CustomType customType = (CustomType)Application.Current.Properties["CustomType"];

للحصول على مزيد من المعلومات، راجع المقالة التالية (قد تحتوي هذه المقالة على ارتباطات إلى محتوى باللغة الإنجليزية (محتوى لم تتم ترجمته بعد)):

موارد خاصة بالتطبيق مشتركة

يوفر التطبيق خاصية Resources للسماح للمطورين بمشاركة موارد واجهة المستخدم عبر التطبيق. يوفر التالي مثال لاستخدام Resources:

      ' Set an application-scope resource
      Application.Current.Resources("ApplicationScopeResource") = Brushes.White


...


      ' Get an application-scope resource
      Dim whiteBrush As Brush = CType(Application.Current.Resources("ApplicationScopeResource"), Brush)
// Set an application-scope resource
Application.Current.Resources["ApplicationScopeResource"] = Brushes.White;


...


// Get an application-scope resource
Brush whiteBrush = (Brush)Application.Current.Resources["ApplicationScopeResource"];

للحصول على مزيد من المعلومات، راجع المقالة التالية (قد تحتوي هذه المقالة على ارتباطات إلى محتوى باللغة الإنجليزية (محتوى لم تتم ترجمته بعد)):

مورد التطبيق, المحتوى و ملفات بيانات موقع الأصل.

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

إدارة نافذة

Application و Window لديهم علاقة وطيدة. كما رأيتها، عمر تطبيق ما يمكن أن تستند مدة بقاء به Windows، كما تم تحديده من قبل ShutdownModeخاصية. Applicationالسجلات في الإطار الذي يتم تعيينه بإطار تطبيق الرئيسي ( Application.MainWindow)، و يحتفظ بقائمة الإطارات منشأ حاليا ( Application.Windows).

لمزيد من المعلومات، راجع نظرة عامة حول Windows WPF.

إدارة التنقل

للتطبيقات المستقل مع التنقل (باستخدام NavigationWindow و Frame) أو تطبيقات XBAP ، Application يكشف عن أي تنقل داخل التطبيق ويقوم بإصدار الأحداث التالية مما هو مناسب:

علاوة على ذلك، Application يوفر إمكانية للتطبيقات من أي نوع لإنشاء ملفات تعريف الارتباط, استمرارها و استردادها, باستخدام GetCookie و SetCookie

لمزيد من المعلومات، راجع نظرة عامة حول التنقل.

راجع أيضًا:

المرجع

Application

المبادئ

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

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

موارد التطبيق WPF و المحتوى و الملفات البيانات