نظرة عامة حول إدارة التطبيق
يوفر هذا الموضوع نظرة عامة حول خدمات 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 الذي يتلقى إدخال المستخدم. التطبيق مع الإطار النشط هو التطبيق النشط (أو التطبيق المقدمة ). التطبيق يصبح تطبيق نشط في الحالات التالية:
يمكنك الكشف عندما يكون التطبيق غير نشط بواسطة معالجة حدث 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، و يظهر التسلسل حيث يتم رفعهم.
خدمات تطبيق أخرى
بالإضافة إلى إدارة مدة بقاء التطبيق, يوفر 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
لمزيد من المعلومات، راجع نظرة عامة حول التنقل.