Silverlight WriteableBitmap неправильно преобразует пользовательский шрифт

Мы используем пользовательские шрифты для представления дорожных знаков и фигур, которые мы наносим на график.

Первоначально я нарисовал все на холсте, который работал нормально, но медленно двигался по горизонтали.

Затем я исправил проблему с прокруткой, преобразовав холст в изображение с помощью WriteableBitmap, например так:

#if SILVERLIGHT
    ImageSource ConvertCanvas(Canvas canvas) {

        WriteableBitmap Source = new WriteableBitmap(canvas, /* transform = */ null);

        Source.Invalidate();

        return Source;
    }
#endif

Это преобразование прекрасно работает для большинства элементов на холсте, кроме TextBlocks, которые используют пользовательский шрифт.

Таким образом, вместо правильных изображений (символов) "пользовательский шрифт", я получаю нормальные символы Arial, такие как 'p', 'q' и т. Д.

Если я снова отобразлю холст вместо преобразованного изображения, то смогу подтвердить, что пользовательский шрифт работает и правильно отображает текстовый блок, поэтому он не кажется проблемой загрузки...

Пожалуйста, помогите или дайте несколько советов, которые я могу посмотреть...

заранее спасибо

РЕДАКТИРОВАТЬ:

Хорошо, я нашел здесь решение, которое сводится либо к 1. созданию скрытого текстового блока, использующего шрифт перед выполнением преобразования, либо к 2. созданию FontSource.

Я использовал первый, потому что это было проще сейчас.

Внутри элемента управления я добавил следующее:

void Grid_Loaded(object sender, RoutedEventArgs e) {
#if SILVERLIGHT
        Grid Grid = (Grid)sender;
        AddFontLoaderTextBox(Grid, "Signs Road Features");
        AddFontLoaderTextBox(Grid, "Signs G Old");
        AddFontLoaderTextBox(Grid, "Signs G");
        AddFontLoaderTextBox(Grid, "Signs G1");
        AddFontLoaderTextBox(Grid, "Signs G2");
        AddFontLoaderTextBox(Grid, "Signs G3");
        AddFontLoaderTextBox(Grid, "Signs Info");
        AddFontLoaderTextBox(Grid, "Signs Regulatory");
        AddFontLoaderTextBox(Grid, "Signs Regulatory1");
        AddFontLoaderTextBox(Grid, "Road Manager");
        AddFontLoaderTextBox(Grid, "Signs Temporary");
        AddFontLoaderTextBox(Grid, "Road Manager");
        AddFontLoaderTextBox(Grid, "Signs Warning");
        AddFontLoaderTextBox(Grid, "Signs Warning1");
#endif
    }

#if SILVERLIGHT
    void AddFontLoaderTextBox(Grid Grid, string fontName) {

        TextBlock TextBlock = new TextBlock();
        TextBlock.FontFamily = new FontFamily(string.Format(
            "pack://application:,,,/ITIS.Controls.LinearViewer.Silverlight;component/Fonts/{0}.ttf#{0}", fontName));
        TextBlock.Opacity = 0; /* hide the text block, we only load it for the font to be cached */
        Grid.SetRowSpan(TextBlock, 3); /* just to ensure the text block doesn't affect the size of the first row */
        Grid.Children.Insert(0, TextBlock); /* keep underneath other children */
    }
#endif

0 ответов

Другие вопросы по тегам