ApplicationContext 类

定义

指定有关应用程序线程的上下文信息。

C#
public class ApplicationContext
C#
public class ApplicationContext : IDisposable
继承
ApplicationContext
实现

示例

下面的代码示例显示两个窗体,并在这两个窗体关闭时退出应用程序。 当应用程序启动和退出时,将记住每个窗体的位置。 此示例演示如何使用 ApplicationContext以及 Application.Run(context) 方法在应用程序启动时显示多个窗体。

MyApplicationContext 继承自 ApplicationContext 并跟踪每个窗体何时关闭,并在两者都关闭时退出当前线程。 类存储用户每个窗体的位置。 表单位置数据存储在标题 Appdata.txt 为 的文件中,该文件是在由 UserAppDataPath确定的位置创建的。

方法 Main 调用 Application.Run(context) 以在给定 的情况下 ApplicationContext启动应用程序。

C#
using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Text;
using System.IO;

namespace MyApplication
{
    // A simple form that represents a window in our application
    public class AppForm2 : System.Windows.Forms.Form
    {
        public AppForm2()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "AppForm2";
        }
    }

    // A simple form that represents a window in our application
    public class AppForm1 : System.Windows.Forms.Form
    {
        public AppForm1()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "AppForm1";
        }
    }

    // The class that handles the creation of the application windows
    class MyApplicationContext : ApplicationContext
    {

        private int _formCount;
        private AppForm1 _form1;
        private AppForm2 _form2;

        private Rectangle _form1Position;
        private Rectangle _form2Position;

        private FileStream _userData;

        private MyApplicationContext()
        {
            _formCount = 0;

            // Handle the ApplicationExit event to know when the application is exiting.
            Application.ApplicationExit += new EventHandler(this.OnApplicationExit);

            try
            {
                // Create a file that the application will store user specific data in.
                _userData = new FileStream(Application.UserAppDataPath + "\\appdata.txt", FileMode.OpenOrCreate);
            }
            catch (IOException e)
            {
                // Inform the user that an error occurred.
                MessageBox.Show("An error occurred while attempting to show the application." +
                                "The error is:" + e.ToString());

                // Exit the current thread instead of showing the windows.
                ExitThread();
            }

            // Create both application forms and handle the Closed event
            // to know when both forms are closed.
            _form1 = new AppForm1();
            _form1.Closed += new EventHandler(OnFormClosed);
            _form1.Closing += new CancelEventHandler(OnFormClosing);
            _formCount++;

            _form2 = new AppForm2();
            _form2.Closed += new EventHandler(OnFormClosed);
            _form2.Closing += new CancelEventHandler(OnFormClosing);
            _formCount++;

            // Get the form positions based upon the user specific data.
            if (ReadFormDataFromFile())
            {
                // If the data was read from the file, set the form
                // positions manually.
                _form1.StartPosition = FormStartPosition.Manual;
                _form2.StartPosition = FormStartPosition.Manual;

                _form1.Bounds = _form1Position;
                _form2.Bounds = _form2Position;
            }

            // Show both forms.
            _form1.Show();
            _form2.Show();
        }

        private void OnApplicationExit(object sender, EventArgs e)
        {
            // When the application is exiting, write the application data to the
            // user file and close it.
            WriteFormDataToFile();

            try
            {
                // Ignore any errors that might occur while closing the file handle.
                _userData.Close();
            }
            catch { }
        }

        private void OnFormClosing(object sender, CancelEventArgs e)
        {
            // When a form is closing, remember the form position so it
            // can be saved in the user data file.
            if (sender is AppForm1)
                _form1Position = ((Form)sender).Bounds;
            else if (sender is AppForm2)
                _form2Position = ((Form)sender).Bounds;
        }

        private void OnFormClosed(object sender, EventArgs e)
        {
            // When a form is closed, decrement the count of open forms.

            // When the count gets to 0, exit the app by calling
            // ExitThread().
            _formCount--;
            if (_formCount == 0)
            {
                ExitThread();
            }
        }

        private bool WriteFormDataToFile()
        {
            // Write the form positions to the file.
            UTF8Encoding encoding = new UTF8Encoding();

            RectangleConverter rectConv = new RectangleConverter();
            string form1pos = rectConv.ConvertToString(_form1Position);
            string form2pos = rectConv.ConvertToString(_form2Position);

            byte[] dataToWrite = encoding.GetBytes("~" + form1pos + "~" + form2pos);

            try
            {
                // Set the write position to the start of the file and write
                _userData.Seek(0, SeekOrigin.Begin);
                _userData.Write(dataToWrite, 0, dataToWrite.Length);
                _userData.Flush();

                _userData.SetLength(dataToWrite.Length);
                return true;
            }
            catch
            {
                // An error occurred while attempting to write, return false.
                return false;
            }
        }

        private bool ReadFormDataFromFile()
        {
            // Read the form positions from the file.
            UTF8Encoding encoding = new UTF8Encoding();
            string data;

            if (_userData.Length != 0)
            {
                byte[] dataToRead = new byte[_userData.Length];

                try
                {
                    // Set the read position to the start of the file and read.
                    _userData.Seek(0, SeekOrigin.Begin);
                    _userData.Read(dataToRead, 0, dataToRead.Length);
                }
                catch (IOException e)
                {
                    string errorInfo = e.ToString();
                    // An error occurred while attempt to read, return false.
                    return false;
                }

                // Parse out the data to get the window rectangles
                data = encoding.GetString(dataToRead);

                try
                {
                    // Convert the string data to rectangles
                    RectangleConverter rectConv = new RectangleConverter();
                    string form1pos = data.Substring(1, data.IndexOf("~", 1) - 1);

                    _form1Position = (Rectangle)rectConv.ConvertFromString(form1pos);

                    string form2pos = data.Substring(data.IndexOf("~", 1) + 1);
                    _form2Position = (Rectangle)rectConv.ConvertFromString(form2pos);

                    return true;
                }
                catch
                {
                    // Error occurred while attempting to convert the rectangle data.
                    // Return false to use default values.
                    return false;
                }
            }
            else
            {
                // No data in the file, return false to use default values.
                return false;
            }
        }

        [STAThread]
        static void Main(string[] args)
        {

            // Create the MyApplicationContext, that derives from ApplicationContext,
            // that manages when the application should exit.

            MyApplicationContext context = new MyApplicationContext();

            // Run the application with the specific context. It will exit when
            // all forms are closed.
            Application.Run(context);
        }
    }
}

注解

可以使用 ApplicationContext 类重新定义导致消息循环退出的情况。 默认情况下, ApplicationContext 侦听Closed应用程序的 main Form上的 事件,然后退出线程的消息循环。

构造函数

ApplicationContext()

不带上下文初始化 ApplicationContext 类的新实例。

ApplicationContext(Form)

使用指定的 ApplicationContext 初始化 Form 类的新实例。

属性

MainForm

获取或设置要用作上下文的 Form

Tag

获取或设置一个对象,该对象包含控件的数据。

方法

Dispose()

释放由 ApplicationContext 使用的所有资源。

Dispose(Boolean)

释放由 ApplicationContext 占用的非托管资源,还可以另外再释放托管资源。

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
ExitThread()

终止线程的消息循环。

ExitThreadCore()

终止线程的消息循环。

Finalize()

尝试在应用程序上下文被垃圾回收前释放资源并执行其他清理操作。

GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
OnMainFormClosed(Object, EventArgs)

调用 ExitThreadCore(),它引发 ThreadExit 事件。

ToString()

返回表示当前对象的字符串。

(继承自 Object)

事件

ThreadExit

当应通过调用 ExitThread() 终止线程的消息循环时发生。

适用于

产品 版本
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9, 10