wpf combobox dependency-properties attached-properties

wpf - Mostrando FontFamily en Combobox



dependency-properties attached-properties (3)

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.

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 FontFamilyProperty y Getter and Setter para él:

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

Luego hay un método ToStyle, que establece el estilo de las etiquetas del diagrama, que deben manipularse:

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

Este 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 Setter diferente para un ComboBox en el Método ToStyle. Pero no tengo idea, cuál. Tal vez algo así:

fontFamilySetter.Property = ComboBox.ItemSource;

Sin embargo, si configuro esa Propiedad, el TextBox aún 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.


ItemsSource aquí espera una colección; por ejemplo Fonts.SystemFontFamilies

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

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

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

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

Agregado por comentario OP.

Aquí hay un ejemplo de enlace a 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)); }


Un gran Combobox de fuentes para WPF se puede encontrar aquí:

CodeProject.com: una fuente ComboBox de XAML-Only

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


Una solución Xaml justo con fuentes ordenadas alfabéticamente:

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