2014-09-02 2 views
1

После загрузки моей PCL DLL под Дополнительные ссылки в LINQpad, я пробовал два разных метода загрузки и отображения шрифтов. Первым из них является наиболее прямо вперед:Можем ли мы загружать и отображать удаленные шрифты в LINQpad?

var xaml = @" 
<UserControl 
    xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> 
    <TextBox 
     FontFamily=""/Songhay.Portable.Resources;Component/Fonts/#FontAwesome"" 
     FontSize=""64"" 
     Text=""&#xf09b;"" 
     /> 
</UserControl> 
"; 

var control = (UserControl)XamlReader.Parse(xaml); 
control.Dump(); 

XAML декларации выше работы достаточно хорошо в WPF правильной, но LINQPad отображает пустой квадрат. Поэтому я попробовал более явный маршрут:

var dll = Assembly.GetAssembly(typeof(Songhay.Portable.Resources.ResourceModule)); 
dll.GetManifestResourceNames().Dump(); 

var resourceName = dll.GetManifestResourceNames().First(i => i.EndsWith("FontAwesome.otf")); 
using (var stream = dll.GetManifestResourceStream(resourceName)) 
{ 
    var localData = new PrivateFontCollection(); 
    var fontdata = new byte[stream.Length]; 
    stream.Read(fontdata, 0, (int)stream.Length); 
    unsafe 
    { 
     fixed(byte * pFontData = fontdata) 
     { 
      localData.AddMemoryFont((System.IntPtr)pFontData, fontdata.Length); 
     } 
    } 
    localData.Dump(); 

    var textBox = new TextBox 
    { 
     FontFamily = new System.Windows.Media.FontFamily(localData.Families.First().Name), 
     FontSize = 64, 
     Text = System.Net.WebUtility.HtmlDecode("&#xf09b;") 
    }; 
    textBox.Dump(); 
} 

Тот же вопрос: пустой квадрат. Слишком большая часть края для LINQpad?

Решение этой проблемы, между прочим, сделало бы LINQpad очень мощным инструментом проектирования - неофициальной эскизной площадкой за пределами церемонии Blend/Visual Studio.

ответ

0

Воспользуйтесь форматом веб-шрифтов SVG и XAML Path элемент:

var path = @"..\font-awesome-4.2.0\fonts\fontawesome-webfont.svg"; 
//You cannot stop .NET from condensing entities so load as string: 
var xml = File.ReadAllText(path).Replace("unicode=\"&#", "unicode=\"&amp;#"); 
var fontAwesomeSvg = XDocument.Parse(xml); 

var scrollViewer = new ScrollViewer 
{ 
    Background = new SolidColorBrush(Colors.Azure), 
    Padding = new Thickness(4), 
    VerticalScrollBarVisibility = ScrollBarVisibility.Visible, 
    Width = 960, Height = 600 
}; 
var wrapPanel = new WrapPanel { Orientation = Orientation.Horizontal }; 

scrollViewer.Content = wrapPanel; 

XNamespace svg = "http://www.w3.org/2000/svg"; 
fontAwesomeSvg.Descendants(svg+"glyph") 
    .ToList().ForEach(i => 
    { 
     var d = i.ToAttributeValueOrDefault("d", string.Empty); 
     var unicode = i.Attribute("unicode").Value; 
     var xaml = @" 
     <Grid xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" 
      Margin=""4""> 
      <Grid.RowDefinitions> 
       <RowDefinition /> 
       <RowDefinition /> 
      </Grid.RowDefinitions> 
      <TextBox 
       Background=""Transparent"" 
       BorderThickness=""0"" 
       HorizontalContentAlignment=""Center"" 
       Text=""{Binding EntityDisplayText, Mode=OneWay}"" 
       /> 
      <Border Grid.Row=""1"" 
       BorderThickness=""2"" BorderBrush=""DarkGray"" 
       MinHeight=""96"" Padding=""4"" 
       Width=""96"" Height=""Auto""> 
       <Path 
        Data=""{Binding StreamGeometry, Mode=OneWay}"" 
        Fill=""Black"" 
        RenderTransformOrigin=""0.5,0.5"" 
        Stretch=""Uniform""> 
        <Path.RenderTransform> 
         <ScaleTransform ScaleY=""-1"" /> 
        </Path.RenderTransform> 
       </Path> 
      </Border> 
     </Grid> 
     "; 
     var control = (Grid)XamlReader.Parse(xaml); 
     control.DataContext = new 
     { 
      StreamGeometry = d, 
      EntityDisplayText = unicode 
     }; 
     wrapPanel.Children.Add(control); 
    }); 

scrollViewer.Dump(); 

Одно предостережение: атрибут d в SVG glyph или path не отображает полностью в XAML Path (обратите внимание, как Path.RenderTransform является используемый).