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

person Daniel Santos    schedule 31.12.2011    source источник


Ответы (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
person Martin Lottering    schedule 06.09.2012

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

Вы уверены, что рендеринг завершится до того, как вы вызовете NotifyComplete() ?

person Claus Jørgensen    schedule 02.01.2012
comment
Я понимаю... но как я могу быть уверен, что шрифт был полностью загружен? Есть обратный вызов для него? - person Daniel Santos; 03.01.2012
comment
Нет. Так что вам придется угадать. Вы можете попробовать несколько блоков искусственной нити на несколько секунд, посмотрите, поможет ли это. - person Claus Jørgensen; 03.01.2012