2010-06-01 14 views
5

Mi objetivo es manipular los estilos de texto de mi aplicación a través de DependencyProperties. Obtuve un diagrama en el que los textos deben manipularse en tamaño, familia de fuentes, color, etc. Me gustaría utilizar una interfaz similar a un editor de texto enriquecido como Word.Mostrar FontFamily en Combobox

Estoy usando este código en mi TextStyleVM http://shevaspace.blogspot.com/2006/12/i-have-some-fun-with-formattedtext_14.html

así que tengo una FontFamilyProperty y un getter y setter para ello:

 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); } 
    } 

Entonces hay un método ToStyle, que define el estilo de las etiquetas del diagrama, que se deben manipular:

 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; 

Ahora esto funciona para un TextBox. El cuadro de texto muestra la FontFamily actual, y si ingreso una FontFamily nueva y válida como Arial en el cuadro de texto, se cambia la FontFamily de las etiquetas.

Sin embargo, lo que me gustaría tener es un cuadro combinado, que muestra los SystemFonts y donde puedo elegir una FontFamily para mis etiquetas. Sin embargo, el enlace no parece funcionar. Ni las fuentes del sistema ni las fuentes actuales de las etiquetas se muestran. El cuadro combinado está vacío.

Esta es mi 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}"/> 

Ahora, supongo que tengo que establecer un organismo diferente para un cuadro combinado en el Método ToStyle. Pero no tengo idea, cuál. Quizás calle detrás de esta manera:

  fontFamilySetter.Property = ComboBox.ItemSource; 

Sin embargo, si establece esa propiedad, el cuadro de texto todavía funciona. Entonces, ¿este es el lugar equivocado para comenzar? También agradecería que alguien me sugiriera alguna documentación sobre el uso de estas palabras clave Style, Setter y Binding, que se usan en el método ToStyle, ya que este es el código de otra persona con el que estoy trabajando.

Respuesta

8

ItemsSource espera una colección; p.ej. Fonts.SystemFontFamilies

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

En realidad, aquí hay un muy buen enlace que cubre la fuente de selección:

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

de Scott Hanselman incluso muestra cómo representar cada elemento de fuente en cuadro combinado con su propia familia de fuentes.


Agregado por OP comentario.

Aquí hay un ejemplo de enlace a la propiedad de dependencia. La propiedad se denomina "MyFontFamily" para evitar colisiones con la propiedad de Windows existente. Lo sentimos, no hay controles Ribbon (tengo 3.5 sp1 desnudo).

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

Esto funciona, por supuesto, pero esto no proporciona ninguna manera de modificar mi FontFamilyProperty. O en otras palabras: ¿cómo puedo unir este ComboBox a mi DependencyProperty llamado FontFamilyProperty? Si establezco SelectedValue o SelectedItem en FontFamily obtengo excepciones de conversión no válidas: "System.Windows.Media.FontFamily" no se puede convertir a "Microsoft.Windows.Controls.Ribbon.RibbonComboBoxItem" – Torsten

+0

Hola Torsten; He agregado un ejemplo de enlace dp. No parece que haya problemas, a menos que desee hacer algo realmente inusual. –

+0

Gracias por su avid soporte. He migrado mi código a la Fluent Ribbon y allí funciona su ejemplo. Tengo algunos cambios menores allí, sin embargo, está basado en tu idea: 1. Tuve que configurar Mode = TwoWay en el Enlace SelectedItem 2. Utilicé FrameworkPropertyMetadata en mi DP (mira el enlace shevaspace.blogspot.com en mi startpost), el UIPropertyMetadata también funciona, creo. Realmente aprecio su ayuda. – Torsten

0

Una gran fuente Combo donde WPF se puede encontrar aquí:

CodeProject.com: A XAML-Only Font ComboBox

Es XAML puro, se puede simplemente copiar/pegar e incluso ordena las fuentes correctamente. El artículo también describe muy bien todos los problemas encontrados y cómo resolverlos.

2

Un justo a Xaml solución con las fuentes almacenadas en orden alfabético:

<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