Mein Ziel ist es, die Text-Stile meiner Anwendung über DependencyProperties zu manipulieren. Ich habe ein Diagramm, in dem die Texte in Größe, Schriftfamilie, Farbe usw. zu manipulieren sind. Ich würde also gerne eine Oberfläche ähnlich einem Rich-Text-Editor wie Word verwenden.Anzeigen von FontFamily in Combobox
Ich verwende diesen Code in meinem TextStyleVM http://shevaspace.blogspot.com/2006/12/i-have-some-fun-with-formattedtext_14.html
So habe ich ein FontFamilyProperty und ein Getter und Setter für sie:
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); }
}
Dann gibt es eine ToStyle Methode, die den Stil setzt für die Beschriftungen des Diagramms, die manipuliert werden sollen:
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;
Jetzt funktioniert das für eine TextBox. Das Textfeld zeigt die aktuelle FontFamily an, und wenn ich eine neue, gültige FontFamily wie Arial in das Textfeld eingib, wird die FontFamily der Labels geändert.
Was ich aber gerne hätte, ist eine Combobox, die die SystemFonts anzeigt und wo ich eine FontFamily für meine Labels auswählen kann. Die Bindung scheint jedoch nicht zu funktionieren. Weder die Systemschriftarten noch die aktuellen Schriftarten der Etiketten werden angezeigt. Die Combobox ist nur leer.
Das ist mein 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}"/>
Nun, ich nehme an, ich habe eine andere Setter für eine ComboBox in dem ToStyle Verfahren einzustellen. Aber ich habe keine Ahnung, welcher. Vielleicht etwas wie folgt:
fontFamilySetter.Property = ComboBox.ItemSource;
Allerdings, wenn ich diese Eigenschaft festlegen, funktioniert die TextBox immer noch. Ist das der falsche Ort, um damit anzufangen? Ich wäre auch dankbar, wenn mir jemand eine Dokumentation über die Verwendung dieser Style-, Setter-, Binding-Schlüsselworte geben könnte, die in der ToStyle-Methode verwendet werden, da dies jemand Code ist, mit dem ich arbeite.
Dies funktioniert natürlich, aber dies liefert keine Möglichkeit, meine FontFamilyProperty zu ändern. Oder mit anderen Worten: Wie binde ich dieses ComboBox an meine DependencyProperty namens FontFamilyProperty? Wenn ich SelectedValue oder SelectedItem auf FontFamily setze, erhalte ich ungültige Cast-Ausnahmen: "System.Windows.Media.FontFamily" kann nicht in "Microsoft.Windows.Controls.Ribbon.RibbonComboBoxItem" umgewandelt werden – Torsten
Hallo Torsten; Ich habe ein Beispiel für DP-Bindung hinzugefügt. Sieht nicht so aus, als gäbe es irgendwelche Probleme, außer du willst etwas wirklich Ungewöhnliches machen. –
Vielen Dank für Ihre Unterstützung. Ich habe meinen Code auf die Fluent Ribbon migriert und dort funktioniert dein Beispiel. Ich habe ein paar kleinere Änderungen, aber es basiert auf Ihrer Idee: 1. Ich musste Mode = TwoWay auf der SelectedItem Binding 2. Ich habe FrameworkPropertyMetadata auf meinem DP (siehe Shevaspace.blogspot.com Link in mein Startpost), die UIPropertyMetadata funktioniert aber auch, denke ich. Ich schätze Ihre Hilfe sehr. – Torsten