Динамическая LiveTile - отрисовка пользовательского шрифта TextBlock в LiveTile с фоновой задачей
У меня проблемы с рендерингом пользовательского текстового блока с ресурсом пользовательского шрифта в LiveTile?
Мой проект обновляет живую плитку в фоновом режиме. но это должно быть персонализировано.
Я использую этот код. но он не работает, текст отображается пустым, когда я пытаюсь использовать встроенный шрифт, растровый фон работает просто отлично. Но шрифты не работает.
Когда я использую этот же код в "агенте переднего плана", шрифты отображаются отлично.
Grid grid = new Grid();
// load your image
StreamResourceInfo info = Application.GetResourceStream(new Uri("tile.jpg", UriKind.Relative));
// create source bitmap for Image control (image is assumed to be alread 173x173)
WriteableBitmap wbmp2 = new WriteableBitmap(1, 1);
wbmp2.SetSource(info.Stream);
Image img = new Image();
img.Source = wbmp2;
// add Image to Grid
grid.Children.Add(img);
TextBlock text = new TextBlock()
{
FontFamily = new FontFamily("/MyTaskAgent;component/Fonts/Fonts.zip#Buxton Sketch"),
Foreground = new SolidColorBrush(Colors.Black) ,
TextWrapping = TextWrapping.Wrap,
};
text.Text = "Test";
// this is our final image containing custom text and image
WriteableBitmap wbmp = new WriteableBitmap(173, 173);
// now render everything - this image can be used as background for tile
wbmp.Render(grid, null);
wbmp.Invalidate();
2 ответа
У меня была похожая проблема, и я нашел решение, пожалуйста, посмотрите здесь или здесь
Я сводлюсь либо к 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
Я не был бы уверен, что проблема связана с размещенным кодом. Я считаю вероятным, что загрузка пользовательского шрифта займет довольно много времени, и, таким образом, фоновый агент завершит работу до того, как шрифт будет загружен, и, как таковой, не будет ничего визуализировать.
Вы уверены, что рендеринг завершен, прежде чем позвонить NotifyComplete()
?