2010-06-01 9 views
5

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.

Antwort

8

ItemsSource erwartet hier eine Sammlung; z.B.

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

Eigentlich ist hier eine sehr schöne Link Abdeckung Schriftauswahl:

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

Scott Hanselman auch zeigt, wie jedes Schriftart Element mit einem eigenen Schriftfamilie in Combobox zu machen.


Hinzugefügt pro OP-Kommentar.

Hier ist ein Beispiel für die Bindung an die Abhängigkeitseigenschaft. Die Eigenschaft heißt "MyFontFamily", um eine Kollision mit der vorhandenen Windows-Eigenschaft zu vermeiden. Entschuldigung, keine Ribbon-Steuerelemente (ich habe 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

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

+0

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

+0

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

0

Ein großer Font Combobox für WPF ist hier zu finden:

CodeProject.com: A XAML-Only Font ComboBox

Es reine XAML ist, kann einfach kopiert/eingefügt werden und sortiert auch die richtig Schriften. Der Artikel beschreibt auch schön alle aufgetretenen Fehler und wie man sie löst.

2

A nur in der XAML-Lösung mit Schriften in alphabetischer Reihenfolge sortiert:

<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