Il mio obiettivo è quello di manipolare gli stili di testo della mia applicazione tramite DependencyProperties. Ho un diagramma in cui i testi devono essere manipolati in dimensioni, fontfamily, colore, ecc. Quindi mi piacerebbe usare un'interfaccia simile a un editor di testo ricco come Word.Visualizzazione di FontFamily in Combobox
Sto usando questo codice nel mio TextStyleVM http://shevaspace.blogspot.com/2006/12/i-have-some-fun-with-formattedtext_14.html
Così ho un FontFamilyProperty e un getter e setter per esso:
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); }
}
Poi c'è un metodo ToStyle, che imposta lo stile per le etichette dello schema, che devono essere manipolate:
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;
Ora questo funziona per un controllo TextBox. La casella di testo mostra la FontFamily corrente, e se inserisco una nuova FontFamily valida come Arial nella casella di testo, la FontFamily delle etichette viene modificata.
Tuttavia, quello che mi piacerebbe avere è una casella combinata, che visualizza i Font di sistema e dove posso scegliere una FontFamily per le mie etichette. Tuttavia, la rilegatura non sembra funzionare. Non vengono visualizzati né i caratteri di sistema né i caratteri correnti delle etichette. La casella combinata è vuota.
Questo è il mio 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}"/>
Ora, suppongo devo impostare un Setter diverso per un ComboBox nel metodo ToStyle. Ma non ho idea, quale. Forse qualcosa del genere:
fontFamilySetter.Property = ComboBox.ItemSource;
Tuttavia, se si imposta quella proprietà, la casella di testo funziona ancora. Quindi questo è il posto sbagliato da cui iniziare? Sarei anche grato se qualcuno potesse suggerirmi qualche documentazione sull'uso di queste parole chiave Stile, Setter, Binding, che sono usate nel metodo ToStyle, poiché questo è il codice di qualcuno con cui lavoro.
Questo funziona, naturalmente, ma questo non fornisce alcun modo per modificare il mio FontFamilyProperty. O in altre parole: Come si associa questo ComboBox alla proprietà Dependency denominata FontFamilyProperty? Se imposto SelectedValue o SelectedItem su FontFamily ottengo eccezioni di cast non valide: "System.Windows.FontFamily" non può essere lanciato su "Microsoft.Windows.Controls.Ribbon.RibbonComboBoxItem" – Torsten
Ciao Torsten; Ho aggiunto un esempio di associazione dp. Non sembra che ci siano problemi con esso a meno che tu non voglia fare qualcosa di veramente inusuale. –
Grazie per il vostro avido supporto. Ho migrato il mio codice sulla barra multifunzione Fluent e il tuo esempio funziona. Tuttavia ho alcune modifiche minori, tuttavia si basa sulla tua idea: 1. Ho dovuto impostare Mode = TwoWay sul SelectedItem Binding 2. Ho usato FrameworkPropertyMetadata sul mio DP (vedi il link shevaspace.blogspot.com in il mio punto di partenza), anche l'UIPropertyMetadata funziona bene, a mio avviso. Apprezzo molto il tuo aiuto. – Torsten