无法使用我的自定义字体打开我的RTF文件

时间:2019-06-29 17:05:10

标签: c# uwp rtf richeditbox

我为UWP程序制作了自己的自定义.ttf字体,并将它们放在Assets文件夹中(相对于2017/2019)。在RichEditBox中处理文档时,它们运行良好。但是,当我保存RTF文件然后打开它时,我的自定义字体将被忽略。如果我预先将自定义字体安装到Windows \ Fonts文件夹中,则“打开文件”将使用我的自定义字体加载文档。看起来好像没有安装我的自定义字体,程序不会将它们链接到文档。

再次-我用RichEditBox和一个自定义字体编写了一个程序。处理后-更改字体,样式等,一切都按设计进行。当我使用该程序保存RTF文件,并使用该程序(相同)打开该RTF时-颜色表还可以,尽管使用该程序编译了字体,但我的字体没有显示(BuildAction-Content; CopyToOutputDirectory-Always Copy)。为了简化-我用文件包含的信息做了按钮。尽管已编译字体(位于Assets文件夹中),但程序不会将其链接到文档。

实际上,我使用该按钮尝试重现此处描述的内容:RichEditBox (UWP) ignores font and foreground when setting Rtf text但是,就我而言,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);
}

这是RichEditBox的XAML:

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



1 个答案:

答案 0 :(得分:1)

Gosha,通过这种方式,您可以将至少一种字体应用于该.rtf文件-参见下文。对于其他人,我认为您需要使用该.rtf中的地图信息,也可以自己制作一张其他地图。那将是一些“ trabajo”,但是你能做什么?

         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();
}