2011-08-10 11 views
5

मैं फ़ॉन्टफमिलियों की सूची का आकलन करता हूं और combobox से बांधता हूं, समस्या तब होती है जब दूषित सिस्टम में कोई फ़ॉन्ट होता है। पूरा आवेदन दुर्घटनाग्रस्त हो जाएगा। किसी भी तरह से मैं systemfontfamilies से जुड़ने में सक्षम हूं, फिर भी त्रुटि प्रदर्शित करने वाले फ़ॉन्ट को छोड़ने में सक्षम है?SystemFontFamilies को संकुचित करते समय combobox

यह कोड ठीक से चलाता है यदि itemtemplate में फ़ॉन्टफैमिली बाध्यकारी टिप्पणी की जाती है।

<ComboBox x:Name="comboFonts" 
          Grid.IsSharedSizeScope="True" 
          Grid.Row="0" Grid.Column="1" 
          ItemsSource="{Binding Source={x:Static Member=Fonts.SystemFontFamilies}}" 
          SelectedItem="{Binding FontFamily, Mode=TwoWay}" 
          HorizontalAlignment="Stretch"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="FontName"></ColumnDefinition> 
         <ColumnDefinition Width="*"></ColumnDefinition> 
        </Grid.ColumnDefinitions> 
        <TextBlock Text="{Binding Source}" HorizontalAlignment="Left"/> 
        <Label FontFamily="{Binding FallbackValue=Verdana}" HorizontalAlignment="Right">Sample</Label> 
       </Grid> 

      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

त्रुटि संदेश प्राप्त निम्नलिखित

Message=Input file or data stream does not conform to the expected file format specification. 
Source=PresentationCore 
StackTrace: 
    at MS.Internal.Text.TextInterface.Native.Util.ConvertHresultToException(Int32 hr) 
    at MS.Internal.Text.TextInterface.Font.CreateFontFace() 
    at MS.Internal.Text.TextInterface.Font.AddFontFaceToCache() 
    at MS.Internal.Text.TextInterface.Font.GetFontFace() 

कृपया मदद के रूप में है। धन्यवाद

उत्तर

4

मुझे एक ही समस्या थी। एक richtextbox संपादक में, मैं सभी उपलब्ध फ़ॉन्ट परिवारों के साथ एक रिबन कॉमोबॉक्स भरता हूं और उस फ़ॉन्ट को उस विशिष्ट आइटम को combobox में संलग्न करता हूं ताकि उपयोगकर्ता तुरंत देख सके कि फ़ॉन्ट कैसा दिखता है।

जब सिस्टम पर एक फ़ॉन्ट था जिसे WPF द्वारा प्रस्तुत नहीं किया जा सकता है, तो एप्लिकेशन क्रैश हो जाएगा।

ईवेंट व्यूअर में स्टैकट्रैक को देखते हुए, मैंने देखा कि WPF सिस्टम के किसी ऑब्जेक्ट को तुरंत चालू करने का प्रयास करता है। Windows.Media.GlyphTypeface। मुझे पता चला कि, जब मैं उस ऑब्जेक्ट को कोड में (System.Windows.Media.Typeface प्रकार के माध्यम से) को तुरंत चालू करने का प्रयास करता हूं और TryGetGlyphTypeface() फ़ंक्शन मेरी विशिष्ट फ़ॉन्ट सेटिंग्स के लिए झूठी वापसी करेगा, तो फ़ॉन्ट WPF में प्रयोग योग्य नहीं है ।

कोड जो मेरे लिए समस्या हल: इस

foreach (FontFamily aFontFamily in Fonts.SystemFontFamilies) 
    { 
     // Instantiate a TypeFace object with the font settings you want to use 
     Typeface ltypFace = new Typeface(aFontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); 
     // Try to create a GlyphTypeface object from the TypeFace object 
     GlyphTypeface lglyphTypeFace; 
     if (ltypFace.TryGetGlyphTypeface(out lglyphTypeFace)) 
     { 
      // Creation of the GlyphTypeface worked. You can use the font 
      RibbonGalleryItem lribItem = new RibbonGalleryItem(); 
      lribItem.Content = aFontFamily.Source; 
      lribItem.FontFamily = aFontFamily; 
      lribGalCatFont.Items.Add(lribItem); 
     } 
    } 

है कि इस कोड निष्पादित किया जाना चाहिए हर मैं बता गया लोड (और कहा कि काफी एक बहुत कुछ है, क्योंकि यह एक उपयोगकर्ता नियंत्रण में है) को रोकने के लिए मुझे क्या करना एप्लिकेशन की शुरुआत में एक बार और वैश्विक चर में उपयोग करने योग्य फोंट की सरणी को सहेजें।

प्रचार के लिए इस कोड Window.Resource पर:

<CollectionViewSource x:Key="MyFonts" Source="{Binding Source={x:Static Fonts.SystemFontFamilies}, Converter={StaticResource FontToSupportedGliphConverter}}"> 
    <CollectionViewSource.SortDescriptions> 
     <componentModel:SortDescription PropertyName="Source" /> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

<Style x:Key="FontStyle"> 
    <Setter Property="Control.FontFamily" Value="{Binding .}" /> 
    <Setter Property="Control.FontSize" Value="16" /> 
</Style> 

<DataTemplate x:Key="FontTemplate"> 
    <VirtualizingStackPanel IsVirtualizing="True" VirtualizationMode="Recycling" ScrollViewer.IsDeferredScrollingEnabled="True"> 
     <TextBlock Style="{StaticResource FontStyle}" Text="{Binding .}" ToolTip="{Binding .}" /> 
    </VirtualizingStackPanel> 
</DataTemplate> 

और यह Converter का उपयोग करें:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    var list = value as IReadOnlyCollection<FontFamily>; 

    if (list == null) 
     return DependencyProperty.UnsetValue; 

    var returnList = new List<FontFamily>(); 
    foreach (FontFamily font in list) 
    { 
     //Instantiate a TypeFace object with the font settings you want to use 
     Typeface ltypFace = new Typeface(font, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); 

     //Try to create a GlyphTypeface object from the TypeFace object 
     GlyphTypeface lglyphTypeFace; 
     if (ltypFace.TryGetGlyphTypeface(out lglyphTypeFace)) 
     { 
      returnList.Add(font); 
     } 
    } 

    return returnList; 
} 

और करने के लिए संसाधनों को लागू करने

+0

नोट, हालांकि, यह वैध फ़ॉन्ट परिवारों, यानी समग्र फ़ॉन्ट्स के लिए 'null' वापस करने के लिए 'TryGetGlyphTypeface()' के लिए _normal_ है। सिर्फ इसलिए कि यह 'शून्य' देता है, इसका मतलब यह नहीं है कि फ़ॉन्ट फ़ाइल भ्रष्ट है (बेशक, यदि आप 'ग्लाइफ टाइपफेस' पर भरोसा कर रहे हैं, तो आपको कंपोजिट को विघटित करके इसे प्राप्त करने के लिए और अधिक काम करना होगा फ़ॉन्ट ... लेकिन यह इस मुद्दे का हिस्सा नहीं है)। –

0

ठीक है, 5 साल बाद, यहाँ एक और समाधान है ComboBox:

<ComboBox x:Name="FreeTextFontComboBox" Margin="10,5" 
      MinWidth="100" MaxWidth="110" IsEditable="True" 
      ItemTemplate="{DynamicResource FontTemplate}" 
      SelectedItem="{Binding Source={x:Static prop:Settings.Default}, 
      Path=FreeTextFontFamily}"> 
    <ComboBox.ItemsSource> 
     <Binding Source="{StaticResource MyFonts}" /> 
    </ComboBox.ItemsSource> 
</ComboBox> 
+0

दूसरे उत्तर में नोट देखें। भ्रष्ट फ़ॉन्ट फ़ाइलों के साथ फोंट के अलावा, यह दृष्टिकोण वैध समग्र फोंट को छोड़ देगा। –

+0

और कुछ फोंट गायब होने से बचने के लिए हम क्या कर सकते हैं? 'रिटर्नलिस्ट' के साथ 'पकड़ने की कोशिश' के अंदर लपेटना। अंत में जोड़ें (फ़ॉन्ट); अंत में? –

+0

जैसा कि मैंने अपनी दूसरी टिप्पणी में लिखा था, जब आप एक समग्र फ़ॉन्ट में आते हैं, तो आपको वास्तविक फ़ॉन्ट प्राप्त करने के लिए और अधिक काम करने की आवश्यकता होती है। अर्थात। उचित 'FontFamily' खोजने के लिए अपने' FamilyMaps' की जांच करें जो यूनिकोड कोड बिंदुओं का समर्थन करता है जिन्हें आप प्रस्तुत करने का प्रयास कर रहे हैं। और हां, अमान्य/भ्रष्ट फोंट के लिए, अपवादों को संभालने से उसे संबोधित किया जा सकता है।हालांकि, यदि आप ऐसा करने जा रहे हैं, तो IMHO, आपको कम से कम उपयोगकर्ता को सूचित करना चाहिए _which_ फ़ॉन्ट अपवाद का कारण बनता है, ताकि वे अपने सिस्टम को ठीक कर सकें। –

संबंधित मुद्दे