Ошибка случайного шрифта Silverlight

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

Проблема с Silverlight

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

BorderedTextBlock.xaml

<UserControl x:Class="MindWorX.CustomPropertyReproduction.Controls.BorderedTextBlock"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" Height="100" Width="200">

    <Grid x:Name="LayoutRoot">
        <Border BorderThickness="1" BorderBrush="Lime">
            <TextBlock Name="MainTextBlock" Margin="4" TextWrapping="Wrap" />
        </Border>
    </Grid>
</UserControl>

BorderedTextBlock.xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace MindWorX.CustomPropertyReproduction.Controls
{
    public partial class BorderedTextBlock : UserControl
    {
        public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(BorderedTextBlock), new PropertyMetadata("TextBlock", new PropertyChangedCallback(OnTextChanged)));

        private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            BorderedTextBlock sender = (d as BorderedTextBlock);
            sender.MainTextBlock.Text = (String)e.NewValue;
        }

        new public static readonly DependencyProperty FontFamilyProperty = DependencyProperty.Register("FontFamily", typeof(FontFamily), typeof(BorderedTextBlock), new PropertyMetadata(new FontFamily("Portable User Interface"), new PropertyChangedCallback(OnFontFamilyChanged)));

        private static void OnFontFamilyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            BorderedTextBlock sender = (d as BorderedTextBlock);
            sender.MainTextBlock.FontFamily = (FontFamily)e.NewValue;
        }

        new public static readonly DependencyProperty FontSizeProperty = DependencyProperty.Register("FontSize", typeof(Double), typeof(BorderedTextBlock), new PropertyMetadata(11d, new PropertyChangedCallback(OnFontSizeChanged)));

        private static void OnFontSizeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            BorderedTextBlock sender = (d as BorderedTextBlock);
            sender.MainTextBlock.FontSize = (Double)e.NewValue;
        }

        public BorderedTextBlock()
        {
            InitializeComponent();
        }

        public String Text
        {
            get { return (String)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        new public FontFamily FontFamily
        {
            get { return (FontFamily)GetValue(FontFamilyProperty); }
            set { SetValue(FontFamilyProperty, value); }
        }

        new public Double FontSize
        {
            get { return (Double)GetValue(FontSizeProperty); }
            set { SetValue(FontSizeProperty, value); }
        }
    }
}

person William Mariager    schedule 17.01.2011    source источник
comment
Если вы можете добавить синтаксис и структуру проекта, которые вы используете, с настраиваемым шрифтом, это очень поможет в попытке выяснить вашу проблему.   -  person Joe McBride    schedule 18.01.2011
comment
Вот воспроизведение проблемы. Если вы протестируете, вы увидите, что он отлично работает с уже существующими шрифтами. Но не с пользовательскими шрифтами. dl.dropbox.com/u/992656/MindWorX.CustomPropertyReproduction.7z   -  person William Mariager    schedule 20.01.2011
comment
не могу понять, что такое расширение .7z, чтобы вытащить его из Dropbox и посмотреть ваш образец. Не могли бы вы опубликовать свой код выше, и это поможет нам определить, в чем может быть проблема?   -  person Todd Main    schedule 20.01.2011
comment
@Otaku: К вопросу добавлен источник элемента управления. Вам нужно будет найти собственный шрифт, чтобы протестировать его на себе.   -  person William Mariager    schedule 20.01.2011


Ответы (1)


Хорошо, я понимаю, в чем проблема, но не знаю, как исправить это процедурно.

Проблема в том, что указание FontFamily пользовательского шрифта не имеет значения (т. Е. Не будет работать), если вы не укажете его имя / путь, например Fonts\mynewfont.ttf#My New Font. В приведенном выше коде просто говорится «поднять My New Font», чего он не понимает во время выполнения, потому что его нельзя найти.

Один из способов обойти это - сделать нужные шрифты в качестве ресурсов в App.xaml и использовать их таким образом, например: <FontFamily x:Key="YanoneKaffeesatzThin">Fonts\Yanone Kaffeesatz-47.ttf#Yanone Kaffeesatz Thin</FontFamily> 1, а затем вызвать приложение этого семейства из кода: myTxtBox.FontFamily = DirectCast(App.Current.Resources("YanoneKaffeesatzThin"), FontFamily).

1 Yanone Kaffeesatz Thin из библиотеки Google Fonts

person Todd Main    schedule 20.01.2011
comment
+1 для примера ресурса xaml. Однако проблема не в назначении из кода, а в том, что я использую конструктор для назначения шрифта. Я сделал еще один настраиваемый элемент управления, в котором реализовал не только настраиваемый шрифт, но и еще 4 поля, связанных со шрифтом. После этого кажется, что все работает как надо. Понятия не имею, почему, но похоже, что проблема устранилась. - person William Mariager; 25.01.2011