首页 > 编程语言 >线程同步,命令行程序创建承载WPF程序运行的另一种实现

线程同步,命令行程序创建承载WPF程序运行的另一种实现

时间:2024-03-20 15:34:46浏览次数:31  
标签:程序运行 创建 xaml 应用程序 Application 线程 WPF MainWindow

WPF Application 类

WPF Application 类是 WPF 应用程序的核心。它负责管理应用程序的生命周期、创建和管理应用程序的主窗口、处理应用程序事件以及提供对应用程序资源的访问。

主要方法和属性

WPF Application 类包含以下主要方法和属性:

  • 构造函数: 构造函数用于初始化应用程序对象。
  • Startup: Startup 方法在应用程序启动时调用。它通常用于创建应用程序的主窗口。
  • Exit: Exit 方法在应用程序退出时调用。它通常用于释放应用程序使用的资源。
  • MainWindow: MainWindow 属性获取或设置应用程序的主窗口。
  • ShutdownMode: ShutdownMode 属性获取或设置应用程序关闭时的行为。
  • Resources: Resources 属性获取应用程序的资源字典。资源字典包含应用程序使用的资源,例如图像、样式和数据模板。

职责

WPF Application 类的主要职责包括:

  • 管理应用程序生命周期: Application 类负责管理应用程序的生命周期,从启动到退出。它处理应用程序启动、运行和关闭时的事件。
  • 创建和管理主窗口: Application 类负责创建和管理应用程序的主窗口。主窗口是应用程序用户界面的主要部分。
  • 处理应用程序事件: Application 类处理应用程序事件,例如应用程序启动、关闭和异常。
  • 提供对应用程序资源的访问: Application 类提供对应用程序资源的访问,例如图像、样式和数据模板。

创建 WPF 应用程序

要创建 WPF 应用程序,请执行以下步骤:

  1. 在你喜欢的开发环境(如 Visual Studio)中创建一个新的 WPF 应用程序项目。
  2. 在 MainWindow.xaml 文件中,使用 XAML 定义应用程序的用户界面。
  3. 在 MainWindow.xaml.cs 文件中,使用 .NET 代码定义应用程序的逻辑。
  4. 在 App.xaml 文件中,定义应用程序的资源和样式。
  5. 在 App.xaml.cs 文件中,定义应用程序类的逻辑。

示例

以下是一个简单的 WPF 应用程序示例:

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Click Me!" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</Window>

 

MainWindow.xaml.cs

using System.Windows;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Button clicked!");
        }
    }
}

 

App.xaml

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
    </Application.Resources>
</Application>

 

App.xaml.cs

using System.Windows;

namespace WpfApplication1
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            // 创建应用程序的主窗口
            MainWindow mainWindow = new MainWindow();

            // 显示主窗口
            mainWindow.Show();
        }
    }
}

 

结论

WPF Application 类是 WPF 应用程序的基础。它提供了管理应用程序生命周期、创建和管理主窗口、处理应用程序事件以及提供对应用程序资源的访问所需的基本功能。理解 WPF Application 类的职责对于创建健壮且可维护的 WPF 应用程序至关重要。

 

实现

 

using System.Windows;
using System.Windows.Markup;
using System.Windows.Threading;
using UiDll;

Thread _uiThread = null;
Application application = null;


var tcs = new TaskCompletionSource<bool>();
_uiThread = new Thread(() =>
{

    application =new Application
    {
        ShutdownMode = ShutdownMode.OnExplicitShutdown
    };

    Window window = new Window();
    tcs.SetResult(true);
    application.Run();
});

_uiThread.SetApartmentState(ApartmentState.STA);
_uiThread.IsBackground = true;
_uiThread.Start();
await tcs.Task.ConfigureAwait(false);

// 在主线程上等待 UI 线程准备好
while (application == null)
{
    Thread.Sleep(100);
}

await application.Dispatcher.BeginInvoke(() =>
{

    var win = new WinTest();
    win.Show();
});


Console.WriteLine("hello world!");
Console.ReadLine();

 

标签:程序运行,创建,xaml,应用程序,Application,线程,WPF,MainWindow
From: https://www.cnblogs.com/xietianjiao/p/18085339

相关文章

  • 线程同步 SynchronizationContext 在命令行程序中创建一个ui线程承载WPF运行
    1、创建一个线程作为ui线程ui线程要求必须是STA线程vart=newThread(()=>{});t.SetApartmentState(ApartmentState.STA);t.Start();2、创建一个公共的SynchronizationContext作为同步的入口在.NET框架中,Dispatcher是一个类,它负......
  • 线程同步 SynchronizationContext 初识
    什么是SynchronizationContext?SynchronizationContext是.NET中的一个类,用于管理跨线程的同步操作。它提供了一种机制,使线程可以协调对共享资源的访问,从而防止并发问题。SynchronizationContext的工作原理SynchronizationContext与每个线程相关联。当线程执行时,它会使用关......
  • redis自学(22)Redis是单线程还是多线程?
    Redis是单线程还是多线程?Redis到底是单线程还是多线程? 如果仅仅聊Redis的核心的业务处理部分(命令处理),答案是单线程 如果是聊整个Redis那么答案是对线程在Redis版本迭代过程中,在两个重要的时间节点上引入了多线程的支持:Redisv4.0:引入多线程异步处理一些耗时较长的任务,......
  • JAVA 线程池SingleThreadExecutor实践教程
    SingleThreadExecutor是一个单线程的Executor,它使用单个工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。下面是使用SingleThreadExecutor的实践教程:步骤1:创建SingleThreadExecutor你可以使用Executors类提供的newSingleThreadExecutor方法来创......
  • JAVA线程池ScheduledThreadPool实践教程
    ScheduledThreadPool用于在给定的延迟之后,或者定期执行任务。以下是如何在Java中实践使用ScheduledThreadPool的步骤:步骤1:创建ScheduledThreadPool首先,使用Executors的newScheduledThreadPool方法来创建一个ScheduledThreadPool。参数是你想要在池中保持的线程数量。i......
  • WPF --- 触摸屏下的两个问题
    合集-桌面应用(8) 1.WPF---非Button自定义控件实现点击功能2023-08-172.MVVM---实现多层级通知2023-08-053.WPF---TextBox的输入校验2023-11-164.WPF---重写圆角DataGrid样式2023-11-175.WPF---如何重写WPF原生控件样式2023-11-176.WPF---如何以Binding方式隐......
  • JAVASE各模块结构图:面向对象、常用类、多线程、异常、IO流、集合、网络编程
    ......
  • 深入浅出Java多线程(十三):阻塞队列
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十三篇内容:阻塞队列。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在多线程编程的世界里,生产者-消费者问题是一个经典且频繁出现的场景。设想这样一个情况:有一群持续不断地生产资源的线程(我们称之......
  • CPU的核心数与线程数对性能的影响是什么
    ​我们经常在CPU的配置参数中看到核心数和线程数,那你知道CPU的核心数与线程数对性能的影响是什么呢?核心数和线程数是越多越好吗?要弄清楚这个问题,我们必须先了解以下几个基础知识。什么是CPU核心?CPU核心,也称为处理器核心,是CPU的基本处理单元。每个核心都包含独立的算术逻辑单元、......
  • WPF —— 控件模版和数据模版
    1:控件模版简介:自定义控件模版:自己添加的样式、标签,控件模版也是属于资源的一种,    每一个控件模版都有一唯一的key,在控件上通过template属性进行绑定什么场景下使用自定义控件模版,当项目里面多个地方使用到相同效果,这时候可以把相同    效果封装成一个......