не могу открыть файл RTF с моими пользовательскими шрифтами - PullRequest
0 голосов
/ 29 июня 2019

Я сделал свои собственные шрифты .ttf для своей программы UWP и поместил их в папку «Ресурсы» (по сравнению с 2017/2019). Они хорошо работают, когда Документ обрабатывается в RichEditBox. Однако когда я сохраняю файл RTF, а затем открываю его, мои пользовательские шрифты игнорируются. Если я предварительно установил свои пользовательские шрифты в папку Windows \ Fonts, то в Open file загрузите документ со своими пользовательскими шрифтами. Похоже, без установки моих пользовательских шрифтов программа не связывает их с документом.

Опять же - я написал программу с RichEditBox и своими пользовательскими шрифтами в этой программе. После обработки - изменились шрифты, изменились стили и т. Д. - все идет по плану. Когда я сохраняю файл RTF с этой программой и открываю этот RTF с этой (той же) программой - таблица цветов в порядке, но мои шрифты не отображаются, хотя шрифты были скомпилированы с этой программой (BuildAction - Content; CopyToOutputDirectory - Copy Always). Чтобы упростить - я сделал кнопку с информацией в файле. Хотя шрифты скомпилированы (находятся в папке «Ресурсы»), программа не связывает их с документом.

На самом деле с помощью этой кнопки я попытался воспроизвести то, что описано здесь: RichEditBox (UWP) игнорирует шрифт и передний план при установке текста Rtf Однако в моем случае RichEditBox показывает только шрифты, установленные в каталоге Windows \ Fonts , Как преодолеть это и использовать ссылки на локальные шрифты, скомпилированные с моей программой, или заставить установщик установить шрифты в каталог Windows \ Fonts? Как я могу использовать свои пользовательские шрифты (связать их с документом), не устанавливая их, или что мне нужно, чтобы моя программа UWP установила мои пользовательские шрифты на устройство пользователя во время установки самого себя?

Это код кнопки, которую я использовал для отображения текста:

private void Page_Click(object sender, RoutedEventArgs e)
{
    string myRtfString = @"{\rtf1\fbidis\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil MyFont;}{\f1\fnil MyFont1;}{\f2\fnil MyFont2;}} {\colortbl ;\red0\green0\blue0;\red255\green255\blue255;\red255\green100\blue0;} {\*\generator Riched20 10.0.18362}\viewkind4\uc1 \pard\sl480\slmult1\qj\cf1\highlight2\f0\fs36 tt\highlight3\f1 g\f0 acgt\f2 c\highlight2\f0 tt\highlight0\par}";
    editor.Document.SetText(TextSetOptions.FormatRtf, myRtfString);
}

Это XAML для RichEditBox:

<RichEditBox 
    x:Name="editor"
    Height="200"
    FontFamily="Assets/Fonts/MyFont.ttf#MyFont"
    FontSize="24" RelativePanel.Below="openFileButton"
    RelativePanel.AlignLeftWithPanel="True"
    RelativePanel.AlignRightWithPanel="True" />



1 Ответ

1 голос
/ 03 июля 2019

Гоша, таким образом вы можете применить хотя бы один из шрифтов к этому файлу .rtf - см. Ниже.Для других, я думаю, вам нужно использовать либо информацию о карте из этого .rtf, либо создать собственную дополнительную карту.Это будет какое-то "трабаджо", но что вы можете сделать?

         private void applyMyFonts()
    {
            string TextOut;
            MyRichEditBox.Document.GetText(TextGetOptions.None, out TextOut);
            MyRichEditBox.Document.Selection.SetRange(0, TextOut.Length);
    MyRichEditBox.Document.Selection.CharacterFormat.Name = "Assets/Fonts/MyFont.ttf#MyFont";   
    }

private async void OpenButton_Click(object sender, RoutedEventArgs e)
    {
        Windows.Storage.Pickers.FileOpenPicker open =
           new Windows.Storage.Pickers.FileOpenPicker();
        open.SuggestedStartLocation =
            Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
        open.FileTypeFilter.Add(".rtf");

        Windows.Storage.StorageFile file = await open.PickSingleFileAsync();

        if (file != null)
        {
            try
            {
                Windows.Storage.Streams.IRandomAccessStream randAccStream =
            await file.OpenAsync(Windows.Storage.FileAccessMode.Read);

                // Load the file into the Document property of the RichEditBox.
                MyRichEditBox.Document.LoadFromStream(Windows.UI.Text.TextSetOptions.FormatRtf, randAccStream);
            }
            catch (Exception)
            {
                ContentDialog errorDialog = new ContentDialog()
                {
                    Title = "File open error",
                    Content = "Sorry, I couldn't open the file.",
                    PrimaryButtonText = "Ok"
                };

                await errorDialog.ShowAsync();
            }
        }

        applyMyfonts();
}
...