2 Stimmen

Silverlight Zufällige Schriftart Fehler

Ich habe ein paar benutzerdefinierte Schriftarten zu einem Silverlight-Projekt hinzugefügt. Ihr Verhalten ist jedoch sehr sporadisch. Ich verwende sie in einem benutzerdefinierten Steuerelement. Wenn ich das Steuerelement zum ersten Mal hinzufüge, wird es gut angezeigt. Wenn ich das Steuerelement neu aufbaue, wird die Schriftart wieder auf den Standardwert zurückgesetzt. Wenn ich die Anwendung in einem Browser anzeige, verwendet sie ebenfalls die Standardschriftart. Die Schriftart ist als Ressource eingebettet.

Silverlight issue

Das obere Bild ist direkt nach dem Hinzufügen des Steuerelements zum Designer, das untere Bild zeigt die Anwendung im Browser. Ich habe keine Ahnung, was die Ursache dafür ist. Wenn Sie den Code für das Steuerelement benötigen, kann ich ihn zur Verfügung stellen.

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

2voto

Todd Main Punkte 31727

Okay, ich verstehe, wo das Problem liegt, aber ich weiß nicht, wie ich das verfahrenstechnisch lösen kann.

Das Problem ist, dass die Angabe der FontFamily der benutzerdefinierten Schriftart spielt keine Rolle (d.h. sie wird nicht funktionieren), wenn Sie sie nicht mit ihrem Namen/Pfad qualifizieren, wie Fonts\mynewfont.ttf#My New Font . Der obige Code besagt lediglich "bring up My New Font ", das es zur Laufzeit nicht versteht, weil es nicht gefunden werden kann.

Eine Möglichkeit, dies zu umgehen, besteht darin, die benötigten Schriftarten als Ressourcen in App.xaml zu erstellen und sie auf diese Weise zu verwenden, z. B: <FontFamily x:Key="YanoneKaffeesatzThin">Fonts\Yanone Kaffeesatz-47.ttf#Yanone Kaffeesatz Thin</FontFamily> 1 und rufen dann die Anwendung dieser Familie im Code auf: myTxtBox.FontFamily = DirectCast(App.Current.Resources("YanoneKaffeesatzThin"), FontFamily) .

1 <em>Yanone Kaffeesatz dünn </em>stammt aus der Google Fonts-Bibliothek

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X