2010-06-01 11 views
5

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.

risposta

8

Elementi qui si aspetta una raccolta; per esempio. Fonts.SystemFontFamilies

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

In realtà, ecco una selezione molto bella carattere collegamento che copre:

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

Scott Hanselman mostra anche come rendere ogni elemento font nella casella combinata con la sua famiglia di font.


Aggiunto per commento OP.

Ecco un esempio di associazione alla proprietà di dipendenza. La proprietà è denominata "MyFontFamily" per evitare la collisione con la proprietà Window esistente. Spiacente, nessun controllo Ribbon (ho sp 3.5 sp1).

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

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

+0

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

+0

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

0

Un grande carattere Combobox per WPF può essere trovato qui:

CodeProject.com: A XAML-Only Font ComboBox

E 'puro XAML, può essere appena copiato/incollato e persino ordina i caratteri correttamente. L'articolo descrive anche tutti i trucchi incontrati e come risolverli.

2

Un solo in XAML soluzione con i caratteri in ordine alfabetico:

<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