代码之家  ›  专栏  ›  技术社区  ›  Torsten

在组合框中显示FontFamily

  •  5
  • Torsten  · 技术社区  · 14 年前

    我的目标是通过DependencyProperties操纵应用程序的文本样式。我得到了一个图表,其中的文本将在大小、字体系列、颜色等方面进行操作,因此我想使用一个类似于Word这样的富文本编辑器的界面。

    http://shevaspace.blogspot.com/2006/12/i-have-some-fun-with-formattedtext_14.html

    所以我有一个FontFamilyProperty和一个Getter和Setter:

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

    还有一个ToStyle方法,它为要操作的图的标签设置样式:

            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;
    

    现在这适用于文本框。文本框显示当前的字体系列,如果我在文本框中输入一个新的、有效的字体系列,比如Arial,标签的字体系列就会改变。

    但是,我想要的是一个组合框,它显示系统字体,在这里我可以为我的标签选择一个字体族。但是,绑定似乎不起作用。既不显示系统字体,也不显示标签的当前字体。组合框只是空的。

    这是我的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}"/>
    

    现在,我假设我必须为ToStyle方法中的ComboBox设置一个不同的Setter。但我不知道是哪一个。也许是这样的:

                fontFamilySetter.Property = ComboBox.ItemSource;
    

    但是,如果我设置了该属性,TextBox仍然可以工作。那么这是不是一个错误的起点?如果有人能给我一些关于使用ToStyle方法中使用的Style-,Setter-,Binding关键字的文档,我也会很感激,因为这是我正在使用的其他人的代码。

    3 回复  |  直到 14 年前
        1
  •  16
  •   DK.    14 年前

    ItemsSource需要一个集合;e、 g.字体.SystemFontFamilies

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

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

    scotthanselman甚至展示了如何在combobox中使用自己的字体族呈现每个字体项。


    下面是绑定到依赖属性的示例。属性名为“MyFontFamily”,以避免与现有窗口的属性发生冲突。抱歉,没有功能区控件(我有3.5 sp1)。

    窗口1.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));
    }
    
        2
  •  6
  •   pr0gg3r    9 年前

    一个按字母顺序排列字体的即时Xaml解决方案:

    <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

        3
  •  3
  •   Peter Huber    11 年前

    WPF的一个很好的字体组合框可以在这里找到:

    CodeProject.com: A XAML-Only Font ComboBox