Отображение FontFamily в Combobox - PullRequest
5 голосов
/ 01 июня 2010

Моя цель - манипулировать текстовыми стилями моего приложения через DependencyProperties. Я получил диаграмму, на которой тексты должны обрабатываться по размеру, семейству шрифтов, цвету и т. Д. Поэтому я хотел бы использовать интерфейс, похожий на текстовый редактор, такой как Word.

Я использую этот код в моем TextStyleVM http://shevaspace.blogspot.com/2006/12/i-have-some-fun-with-formattedtext_14.html

Итак, у меня есть FontFamilyProperty и Getter and 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;

Теперь это работает для TextBox. В текстовом поле отображается текущее FontFamily, и если я введу в текстовое поле новый действительный FontFamily, такой как Arial, метки FontFamily будут изменены.

Тем не менее, я хотел бы иметь комбинированный список, который отображает системные шрифты и где я могу выбрать одну FontFamily для своих меток. Тем не менее, привязка не работает. Ни системные шрифты, ни текущие шрифты меток не отображаются. В выпадающем списке просто пусто.

Это мой 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}"/>

Теперь я предполагаю, что мне нужно установить другой Setter для ComboBox в методе ToStyle. Но я понятия не имею, какой. Может быть, что-то вроде этого:

            fontFamilySetter.Property = ComboBox.ItemSource;

Однако, если я установлю это свойство, TextBox все еще будет работать. Так с чего начать? Я также был бы признателен, если бы кто-нибудь намекнул мне на некоторую документацию об использовании этих ключевых слов Style-, Setter-, Binding-key, которые используются в методе ToStyle, так как это кто-то другой, с которым я работаю.

Ответы [ 3 ]

9 голосов
/ 01 июня 2010

ItemsSource здесь ожидает коллекцию;например, Fonts.SystemFontFamilies

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

Собственно, вот очень хорошая ссылка, охватывающая выбор шрифта:

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

Скотт Хансельман даже показывает, как отображать каждый элемент шрифтавыпадающий список с собственным семейством шрифтов.


Добавлено для каждого комментария OP.

Вот пример привязки к свойству зависимости.Свойство называется «MyFontFamily», чтобы избежать конфликта с существующим свойством Window.Извините, нет элементов управления ленты (у меня есть 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));
}
3 голосов
/ 02 апреля 2015

Простое решение 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

0 голосов
/ 05 сентября 2013

Отличный комбинированный шрифт для WPF можно найти здесь:

CodeProject.com: комбинированный шрифт только для XAML

Это чистый XAML, его можно просто скопировать / вставить и даже правильно сортировать шрифты. В статье также подробно описываются все обнаруженные ошибки и способы их решения.

...