2017-11-30 9 views
0

this article by Scott Hanselman에 따라 WPF 글꼴 드롭 다운을 만들려고합니다.FontFamilies를 보여주는 WPF 콤보 박스는 가비지 이름을 나열합니다.

일부 글꼴은 읽기 쉽지 않은 글꼴 이름을 표시하는 데 적절한 문자가 없습니다 (예 : Webdings, Windings, Symbol, Bookshelf Symbol 7). .

이걸 어떻게 동적으로 감지하고 WPF를 사용하면 Arial과 같은 유용한 것으로 되돌릴 수 있습니까?

+0

동적으로 무엇을 의미하는지 모르겠지만 알파벳은 char (65)부터 char (100)까지의 범위에 있다고 생각합니다. 그 범위를 벗어난 경우 글꼴 이름의 첫 번째 문자를 되돌려 놓아야합니다. 그것 또는 당신이하고 싶은 다른 것 .. 그냥 아이디어 .. – johnyTee

+1

https://stackoverflow.com/questions/4798370/wpf-how-to-filter-out-non-roman-fonts-from-fonts-systemfontfamilies –

+1

@ johnyTee는 FontFamily를 사용하여 속성을 쿼리하여 "Webdings"라는 단어가 사람이 읽을 수 있고 이상한 기호가 아닌지 확인한 다음 Arial을 사용하여 "Webdings"텍스트를 렌더링합니다 – GilesDMiddleton

답변

2

사용자 지정 IValueConverter를 사용하여 ComboBoxItem 텍스트의 FontFamily를 설정할 수 있습니다. 글꼴 모음이 기호 기반 인 경우 글꼴이 적용되지 않습니다.

XAML

<Window x:Class="WpfApp4.MainWindow" 
    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" 
    xmlns:converters="clr-namespace:WpfApp4.Views.Converters" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Grid.Resources> 
     <converters:PrintableFontFamilyConverter x:Key="PrintableFontFamilyConverter" /> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*"></RowDefinition> 
    </Grid.RowDefinitions> 
    <ComboBox x:Name="ComboBox" ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Source}" FontFamily="{Binding Converter={StaticResource PrintableFontFamilyConverter}}" Height="20"></TextBlock> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
    <TextBox Grid.Row="1" FontFamily="{Binding ElementName=ComboBox, Path=SelectedValue}"></TextBox> 
</Grid> 

변환기

public class PrintableFontFamilyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var fontFamily = value as FontFamily; 

     if (fontFamily != null) 
     { 
      foreach (var typeface in fontFamily.GetTypefaces()) 
      { 
       if (typeface.TryGetGlyphTypeface(out var glyphTypeface)) 
       { 
        if (glyphTypeface.Symbol) 
        { 
         return null; 
        } 
       } 
      } 
     } 

     return fontFamily; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

스크린 샷

Dropdown with various font renderings
+0

우리 팀이 방금이를 구현했으며 훌륭하게 작동했습니다. ! 많은 감사합니다. – GilesDMiddleton

1

글꼴은 읽기 쉽거나 정보가 없으면 정보를 전달하지 않으므로 간단한 해결책은 단순히 nonadeble 글꼴 (또는 읽기 가능)을 모두 추가하는 것입니다.

 InitializeComponent(); 
     List<string> nonReadebleFonts = new List<string>(); 
     nonReadebleFonts.Add("Wingdings"); 
     foreach (FontFamily font in Fonts.SystemFontFamilies) 
     { 
      ComboBoxItem boxItem = new ComboBoxItem(); 
      boxItem.Content = font.ToString(); 
      Uri s = font.BaseUri; 
      if (!nonReadebleFonts.Contains(font.ToString())) 
      { 
       boxItem.FontFamily = font; 
      } 

      fontsComboBox.Items.Add(boxItem); 
     }