Моя цель состоит в том, чтобы управлять стилями текста моего приложения через 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, с которым я работаю.
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));
}