2010-06-01 9 views
5

Mon but est de manipuler les styles de texte de mon application via DependencyProperties. J'ai un diagramme dans lequel les textes doivent être manipulés en taille, fontfamily, couleur, etc. Donc je voudrais utiliser une interface semblable à un éditeur de texte riche comme Word.Afficher FontFamily dans Combobox

J'utilise ce code dans mon TextStyleVM http://shevaspace.blogspot.com/2006/12/i-have-some-fun-with-formattedtext_14.html

J'ai donc FontFamilyProperty et un Getter et Setter pour elle:

 public static DependencyProperty FontFamilyProperty = 
      DependencyProperty.Register(
       "FontFamily", 
       typeof(FontFamily), 
       typeof(OutlinedText), 
       new FrameworkPropertyMetadata(
        SystemFonts.MessageFontFamily, 
        FrameworkPropertyMetadataOptions.AffectsRender | 
        FrameworkPropertyMetadataOptions.AffectsMeasure), 
         new ValidateValueCallback(IsValidFontFamily)); 

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

Ensuite, il y a une méthode ToStyle, qui définit le style de les étiquettes du diagramme, qui doivent être manipulées:

 Style style = new Style(); 
     Binding fontFamilyBinding = new Binding("FontFamily"); 
     fontFamilyBinding.Source = this; 
     Setter fontFamilySetter = new Setter(); 
     fontFamilySetter.Property = TextBlock.FontFamilyProperty; 
     fontFamilySetter.Value = fontFamilyBinding; 
     style.Setters.Add(fontFamilySetter); 

     return style; 

Maintenant cela fonctionne pour un TextBox. La zone de texte affiche la FontFamily en cours, et si j'entre une nouvelle FontFamily valide comme Arial dans la zone de texte, la famille FontFamily des étiquettes est modifiée. Cependant, ce que je voudrais avoir est un combobox, qui affiche les SystemFonts et où je peux choisir un FontFamily pour mes étiquettes. Cependant, la liaison ne semble pas fonctionner. Ni les polices système ni les polices actuelles des étiquettes ne sont affichées. La liste déroulante est juste vide.

Ceci est mon XAML:

  <r:RibbonLabel Content="FontFamily" /> 
      <!--these do not work--> 
      <r:RibbonComboBox SelectedItem="{Binding FontFamily}"/> 
      <r:RibbonComboBox ItemsSource="{Binding FontFamily}"/> 
      <!--this works--> 
      <r:RibbonTextBox Text="{Binding FontFamily}"/> 

Maintenant, je suppose que je dois mettre un autre Setter pour une ComboBox dans la méthode ToStyle. Mais je n'ai aucune idée, laquelle. Peut-être quelque chose comme ceci:

  fontFamilySetter.Property = ComboBox.ItemSource; 

Cependant, si je définis cette propriété, le TextBox fonctionne toujours. Alors, est-ce le mauvais endroit pour commencer? Je serais également reconnaissant si quelqu'un pourrait me suggérer une certaine documentation sur l'utilisation de ces mots clés Style, Setter, Binding, qui sont utilisés dans la méthode ToStyle, puisque c'est un code avec lequel je travaille.

Répondre

8

ItemsSource ici attend une collection; par exemple. Fonts.SystemFontFamilies

<ComboBox ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}"/> 

En fait, voici un lien très agréable couvrant la sélection de la police:

http://www.hanselman.com/blog/LearningWPFWithBabySmashCustomerFeedbackAndAWPFFontComboBox.aspx

Scott Hanselman montre même comment rendre chaque élément de police dans combobox avec sa propre famille de polices.


Ajouté par commentaire OP.

Voici un exemple de liaison à la propriété de dépendance. La propriété est nommée "MyFontFamily" pour éviter la collision avec la propriété Window existante. Désolé, pas de contrôles du ruban (j'ai 3.5 sp1 nu).

Window1.xaml

<Window 
    x:Class="SimpleWpf.Window1" 
    x:Name="ThisWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Orientation="Vertical"> 
     <ComboBox 
      SelectedItem="{Binding MyFontFamily, ElementName=ThisWindow}" 
      ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}"/> 
     <TextBlock 
      Text="Lazy dog jumper" 
      FontFamily="{Binding MyFontFamily, ElementName=ThisWindow}" 
      FontSize="24"/> 
    </StackPanel> 
</Window> 

Window1.xaml.cs

public partial class Window1 : Window 
{ 
    // ... 

    public static readonly DependencyProperty MyFontFamilyProperty = 
     DependencyProperty.Register("MyFontFamily", 
     typeof(FontFamily), typeof(Window1), new UIPropertyMetadata(null)); 
} 
+0

Cela fonctionne bien sûr, mais cela ne fournit aucun moyen de modifier mon FontFamilyProperty. Ou en d'autres termes: comment lier ce ComboBox à mon DependencyProperty nommé FontFamilyProperty? Si je mets SelectedValue ou SelectedItem à FontFamily, je reçois des exceptions de distribution invalides: "System.Windows.Media.FontFamily" ne peut pas être converti en "Microsoft.Windows.Controls.Ribbon.RibbonComboBoxItem" – Torsten

+0

Hi Torsten; J'ai ajouté un exemple de liaison dp. Il ne semble pas y avoir de problèmes à moins que vous ne vouliez faire quelque chose de vraiment inhabituel. –

+0

Merci pour votre soutien av J'ai migré mon code vers le ruban Fluent et votre exemple fonctionne. J'ai quelques changements mineurs là cependant, il est basé sur votre idée: 1. J'ai dû mettre Mode = TwoWay sur la liaison SelectedItem 2. J'ai utilisé FrameworkPropertyMetadata sur mon DP (voir le lien shevaspace.blogspot.com dans mon startpost), le UIPropertyMetadata fonctionne aussi, cependant, je pense. J'apprécie vraiment votre aide. – Torsten

0

Une grande police Combobox pour WPF se trouve ici:

CodeProject.com: A XAML-Only Font ComboBox

Il est XAML pur, peut être simplement copier/coller et trie même les polices correctement. L'article décrit également gentiment tous les gotchas rencontrés et comment les résoudre.

2

juste en solution Xaml avec les polices triées par ordre alphabétique:

<Window x:Class="WpfFontsComboBox.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:System="clr-namespace:System;assembly=mscorlib" 
     xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
     Height="350" Width="525"> 
    <Window.Resources> 
     <CollectionViewSource x:Key="SortedFontsCollection" Source="{Binding Source={x:Static Fonts.SystemFontFamilies}}" > 
      <CollectionViewSource.SortDescriptions> 
       <ComponentModel:SortDescription PropertyName="Source" /> 
      </CollectionViewSource.SortDescriptions> 
     </CollectionViewSource> 
    </Window.Resources> 
    <StackPanel> 
     <Label Content="42" FontFamily="{Binding ElementName=comboBoxFonts, Path=SelectedItem}" /> 
     <ComboBox x:Name="comboBoxFonts" ItemsSource="{Binding Source={StaticResource SortedFontsCollection}}" /> 
    </StackPanel> 
</Window> 

enter image description here enter image description here