Как программно установить свойства TextBlock с помощью C++/WinRT + WinUI 3

Я много лет прятался под скалой MFC, поэтому могу придерживаться стандартного C++, но при этом писать приложения для Windows Desktop. С C++/WinRT и WinUI 3.0, похоже, у меня наконец-то появится возможность модернизировать свой код. Проблема в том, что я ничего не знаю о XAML или Windows API. Чтобы решить эту проблему, я пытаюсь проработать книгу Петцольда "Программирование Windows, 6-е изд.", Заменив код C# на C++/WinRT. Когда все, что мне нужно сделать, это написать XAML, все будет в порядке. Однако когда я перейду к стр. 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 и HorizontalAlignment. Как правильно получить доступ к этим перечислениям? Я забыл включить или "использовать"? Вот что у меня сейчас есть:

#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;

Надеюсь, на мой длинный вопрос есть короткий ответ.

1 ответ

Решение

Конечно, вам нужно опубликовать немного больше деталей (например, какое сообщение об ошибке вы получаете). Но я предполагаю, что, возможно, в вашем коде отсутствует квалификатор пространства имен. Я просто ухожу от типов пространств имен Windows UWP, а не от пространства имен 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);
}
Другие вопросы по тегам