Отображение FontFamily в поле комбинированного списка

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

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

Таким образом, у меня есть FontFamilyProperty и Метод считывания и Метод set для него:

        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 маркировок изменяются.

Однако то, что я хотел бы иметь, является полем комбинированного списка, которое отображает SystemFonts и где я могу выбрать один FontFamily для своих маркировок. Однако привязка, кажется, не работает. Ни системные шрифты, ни текущие шрифты маркировок не отображены. Поле комбинированного списка просто пусто.

Это - мой xaml:

            
            
            
            
            
            

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

            fontFamilySetter.Property = ComboBox.ItemSource;

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

6
задан Torsten 1 June 2010 в 13:48
поделиться

1 ответ

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

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

На самом деле, вот очень хорошая ссылка по выбору шрифтов:

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

Scott Hanselman даже показывает, как отобразить каждый элемент шрифта в combobox с его собственным семейством шрифтов.


Добавлено в соответствии с комментарием OP.

Вот пример привязки к свойству зависимости. Свойство названо "MyFontFamily", чтобы избежать столкновения с существующим свойством окна. Извините, нет элементов управления ленты (у меня голая 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));
}
12
ответ дан 8 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: