Core App 项目中的 Win2D

Win2D 快速入门生成简单的 Win2D 应用主题都介绍了在使用 XAML 用户界面 (UI) 框架的项目中使用 Win2D。 但是,可以在根本不使用 XAML 的项目中使用 Win2D。

本主题介绍如何在 UWP Core App 项目中使用 CanvasSwapChain 来显示 Win2D 内容。 可以在 Windows 和 Xbox 上运行生成的应用。 这种类型的应用程序也称为 CoreApplication 应用程序UWP DirectX 应用程序

平台 API:IFrameworkViewSourceIFrameworkViewCoreWindowCoreApplicationCoreApplicationViewCanvasSwapChainCanvasDrawingSession

创建和配置新项目

我们将创建一个 XAML 项目来开始。 但是,我们会在继续操作时从中删除所有 XAML。

  1. 在 Visual Studio 中,从“空白应用(通用 Windows)”项目模板创建新项目。 对于语言,请选择:C#;平台:Windows;项目类型:UWP

  2. 然后,若要设置项目以使用 Win2D,请参阅引用 Win2D NuGet 包

修改项目文件

  1. 由于我们不会使用 XAML,因此请继续从项目中删除以下文件:App.xamlApp.xaml.csMainPage.xamlMainPage.xaml.cs

  2. 然后向项目添加一个新的;将文件命名为 Program.cs

将代码添加到 Program.cs

  1. Program.cs 的全部内容替换为以下代码列表:
// Program.cs
using Microsoft.Graphics.Canvas;
using Windows.ApplicationModel.Core;
using Windows.Graphics.Display;
using Windows.UI;
using Windows.UI.Core;

public sealed class App : IFrameworkViewSource, IFrameworkView
{
    private CoreApplicationView view;
    private CoreWindow window;
    private CanvasSwapChain swapChain;

    public IFrameworkView CreateView()
    {
        return this;
    }

    public void Initialize(CoreApplicationView applicationView)
    {
        this.view = applicationView;
    }

    public void SetWindow(CoreWindow window)
    {
        this.view.TitleBar.ExtendViewIntoTitleBar = true;
        this.window = window;
    }

    public void Load(string entryPoint)
    {
    }

    public void Run()
    {
        this.swapChain = CanvasSwapChain.CreateForCoreWindow(
            resourceCreator: CanvasDevice.GetSharedDevice(),
            coreWindow: this.window,
            dpi: DisplayInformation.GetForCurrentView().LogicalDpi);

        this.swapChain.ResizeBuffers((float)this.window.Bounds.Width, (float)this.window.Bounds.Height);

        using (CanvasDrawingSession session = this.swapChain.CreateDrawingSession(Colors.Black))
        {
            session.DrawEllipse(155, 115, 80, 30, Colors.Cyan, 3);
            session.DrawText("Hello, Win2D World!", 100, 100, Colors.Yellow);
        }

        this.swapChain.Present();

        this.window.Activate();
        this.window.Dispatcher.ProcessEvents(CoreProcessEventsOption.ProcessUntilQuit);
    }

    public void Uninitialize()
    {
    }
}

public static class Program
{
    public static void Main()
    {
        CoreApplication.Run(new App());
    }
}

注意

此示例包含一个单独的 Program 类,其中包含程序的 Main 入口点,随后会启动实际的 CoreApplication 应用程序。 但不必将入口点置于单独的类中:如果希望采用这种方式构建代码,可以改为在 App 类的内部移动 Main 方法。 如果正在使用 C# 10 或更高版本,CoreApplication.Run(new App()); 表达式语句也可能位于顶级语句中。

即将完成

现在,可以继续生成并运行应用,会看到以下输出:

核心应用中呈现的 Win2D 内容

在应用模型方面,上一部分中的代码有一个 App 类,该类实现 IFrameworkViewSourceIFrameworkView 接口,这是 Core App 所必需的。 Main 函数入口点调用 CoreApplication.Run 来运行该 App 类的实例。

在图形方面,该代码为主 CoreWindow 创建了一个 CanvasSwapChain,并将内容绘制到其中。

可以采用喜欢的任何方式扩展上述示例应用。 例如,对于简单的 2D 游戏,这可能是一个很好的起点。

另请参阅