【问题标题】:How do I make a WinUI 3 GUI in code without XAML?如何在没有 XAML 的代码中制作 WinUI 3 GUI?
【发布时间】:2022-07-18 23:54:38
【问题描述】:

我正在将一种编程语言移植到具有“创建窗口”和“在该窗口中创建按钮”等命令的 Windows。编程语言本身是用 C++ 实现的。

我听说 Windows 上最新的、推荐的 UI API 是 WinUI 3,但我真的找不到任何关于如何在代码中定义 GUI 而不是从 XAML 文件加载它的好信息。

如何在代码中创建 WinUI 3 GUI?

【问题讨论】:

  • 您通过实例化其对应的 Windows 运行时类型来实例化 UI 控件,例如Button 类型。
  • 谢谢,这是一个开始,但是没有窗口和应用程序可以将它们放入,我无法充分利用这些信息。 MS没有最小应用程序的示例代码吗? XAML 生成的模板代码似乎只是针对应用程序对象和空窗口的大量代码,其中包含所有 winrt_get_activation_factory 等函数、AppT 子类等。
  • 在 Kenny Kerr 的 GitHub 中有一个 XamlCode 示例,以防万一。我不清楚您是在创建编译语言,即您需要生成 (C++) 代码,还是在运行创建 UI 的解释器。
  • 它是一个解释器,所以我事先不知道我需要每种类型的多少元素以及它们各自的属性将被设置为什么,而且我不会有一个 C++ 编译器来编译生成的代码(除了可以作为解释器的一部分生成的代码之外)。
  • 在当前版本的 Visual Studio 上实际制作此示例是否有技巧?它使用较旧的 SDK,当我使用菜单项来提升 SDK 时,它失败并出现有关 PCH 的错误:(

标签: c++ windows winui-3


【解决方案1】:

这个例子是在 C# 中,但它也应该在 C++ 中工作。

执行以下步骤:

  • 创建 WinUI 项目
  • 可选步骤:删除“MainWindow.xaml”文件(以及文件 MainWindow.xaml.cs 后面的代码)
  • 转到 App.xaml.cs 文件并更改 OnLaunched 方法的代码。请参阅下面的示例

示例代码创建了一个Window 类型的实例,内容为StackPanelStackPanel 包含 TextBlockButton。如果单击按钮,事件处理代码将使用Debug.WriteLine 编写一些东西。

    /// <summary>
    /// Invoked when the application is launched normally by the end user.  Other entry points
    /// will be used such as when the application is launched to open a specific file.
    /// </summary>
    /// <param name="args">Details about the launch request and process.</param>
    protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
    {
        // The original version of the method just contained these two lines:
        //m_window = new MainWindow();
        //m_window.Activate();

        m_window = new Window();

        StackPanel stackPanel = new StackPanel();

        TextBlock textBlock = new TextBlock();
        textBlock.Text = "Text of the TextBlock";

        Button button = new Button();
        button.Content = "Click Me";
        button.Click += (object sender, RoutedEventArgs e) => { Debug.WriteLine("Button clicked"); };

        stackPanel.Children.Add(textBlock);
        stackPanel.Children.Add(button);

        m_window.Content = stackPanel;
        m_window.Activate();
    }

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2020-11-15
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2022-10-22
    • 2021-12-08
    • 2020-11-25
    相关资源
    最近更新 更多