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.
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
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. –
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