【问题标题】:How to set TextBlock properties programmatically using C++/WinRT + WinUI 3如何使用 C++/WinRT + WinUI 3 以编程方式设置 TextBlock 属性
【发布时间】:2020-10-23 23:03:22
【问题描述】:

多年来,我一直隐藏在 MFC 的岩石之下,因此我可以坚持使用标准 C++,但仍然可以编写 Windows 桌面应用程序。使用 C++/WinRT 和 WinUI 3.0,我似乎终于有机会对我的代码进行现代化改造。问题是我对 XAML 或 Windows API 一无所知。为了解决这个问题,我正在尝试通过 Petzold 的“Programming Windows, 6th ed.”,用 C++/WinRT 替换 C# 代码。当我所要做的就是编写 XAML 时,一切都是徒劳的。但是,当我到达 p。 24,我应该在代码中调整 TextBlock 属性。这是 C#:

TextBlock tb = new TextBlock();
tb.Text = "Hello, Windows 8!";
tb.FontFamily = new FontFamily("Times New Roman");
tb.FontSize = 96;
tb.FontStyle = FontStyle.Italic;
...

这是我的替换尝试:

TextBlock tb;
tb.Text(L"Hello, Windows 8!");
tb.FontFamily(FontFamily(L"Times New Roman"));
tb.FontSize(96);
tb.FontStyle(FontStyle::Italic);
...

一切顺利,直到最后一行。无法识别“FontStyle::Italic”。我对 Color 和 Horizo​​ntalAlignment 的枚举也有类似的问题。访问这些枚举的正确方法是什么?我是否忘记了包含或“使用”?这是我目前拥有的:

#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.ApplicationModel.Activation.h>
#include <winrt/Microsoft.UI.Composition.h>
#include <winrt/Microsoft.UI.Text.h>
#include <winrt/Microsoft.UI.Xaml.h>
#include <winrt/Microsoft.UI.Xaml.Controls.h>
#include <winrt/Microsoft.UI.Xaml.Controls.Primitives.h>
#include <winrt/Microsoft.UI.Xaml.Data.h>
#include <winrt/Microsoft.UI.Xaml.Interop.h>
#include <winrt/Microsoft.UI.Xaml.Markup.h>
#include <winrt/Microsoft.UI.Xaml.Media.h>
#include <winrt/Microsoft.UI.Xaml.Navigation.h>
#include <winrt/Microsoft.UI.Xaml.Shapes.h>

using namespace winrt;
using namespace Microsoft::UI::Text;
using namespace Microsoft::UI::Xaml::Controls;
using namespace Microsoft::UI::Xaml::Controls::Primitives;
using namespace Microsoft::UI::Xaml::Media;

我希望我的长问题能得到一个简短的回答。

【问题讨论】:

  • FontStyle 被记录为enum(而不是enum class)。在这种情况下,使用Italic 代替FontStyle::Italic
  • 不是这样。文档可能需要调整,但 C++/WinRT 将所有枚举生成为作用域枚举。

标签: c++ c++-winrt winui-3


【解决方案1】:

可以肯定的是,您需要发布更多详细信息(例如您收到的错误消息)。但我猜测您的代码可能缺少命名空间限定符。我只是离开了 UWP Windows 命名空间类型,而不是 WinUI Microsoft 命名空间,但是这段代码是为我构建的:

#include <winrt/Windows.UI.h>
#include <winrt/Windows.UI.Text.h>
#include <winrt/Windows.UI.Xaml.h>
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.Media.h>

void f()
{
    winrt::Windows::UI::Xaml::Controls::TextBlock tb;
    tb.Text(L"Hello");
    tb.FontFamily(winrt::Windows::UI::Xaml::Media::FontFamily(L"Times New Roman"));
    tb.FontSize(96);
    tb.FontStyle(winrt::Windows::UI::Text::FontStyle::Italic);
    tb.SelectionHighlightColor(winrt::Windows::UI::Xaml::Media::SolidColorBrush(winrt::Windows::UI::Colors::Red()));
    tb.HorizontalAlignment(winrt::Windows::UI::Xaml::HorizontalAlignment::Center);
}

这样:

#include <winrt/Windows.UI.h>
#include <winrt/Windows.UI.Text.h>
#include <winrt/Windows.UI.Xaml.h>
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.Media.h>

using namespace winrt;
using namespace winrt::Windows::UI;
using namespace winrt::Windows::UI::Text;
using namespace winrt::Windows::UI::Xaml;
using namespace winrt::Windows::UI::Xaml::Controls;
using namespace winrt::Windows::UI::Xaml::Media;

void f()
{
    TextBlock tb;
    tb.Text(L"Hello");
    tb.FontFamily(FontFamily(L"Times New Roman"));
    tb.FontSize(96);
    tb.FontStyle(FontStyle::Italic);
    tb.SelectionHighlightColor(SolidColorBrush(Colors::Red()));
    tb.HorizontalAlignment(HorizontalAlignment::Center);
}

【讨论】:

  • 啊哈!搞定了。看来问题在于我使用的是 winrt::Microsoft 包含和命名空间,而不是 winrt::Windows。我需要的功能尚未在 Microsoft 命名空间中实现 - 只是预发布警告的一部分。现在我只需要弄清楚 contentGrid().Children.Append() 发生了什么变化就可以了。
  • Ryan,感谢您提供的示例,这些示例为我提供了所需的洞察力。顺便说一句,我发现了 contentGrid().Children.Append() 的问题:XAML 正在从 Microsoft 命名空间获取 Grid,而代码正在从 Windows 命名空间获取它。我想我会等待 Microsoft 命名空间代码所需的更新。
猜你喜欢
  • 2022-10-04
  • 1970-01-01
  • 2021-06-22
  • 2023-01-03
  • 2015-07-04
  • 2021-05-20
相关资源
最近更新 更多