在组合框中显示 FontFamily
我的目标是通过 DependencyProperties 操作应用程序的文本样式。我得到了一个图表,其中要对文本的大小、字体系列、颜色等进行操作。所以我想使用类似于 Word 等富文本编辑器的界面。
我在 TextStyleVM 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;
现在这适用于文本框。文本框显示当前的 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}"/>
现在,我假设我必须在 ToStyle 方法中为 ComboBox 设置不同的 Setter。但我不知道是哪一个。也许是这样的:
fontFamilySetter.Property = ComboBox.ItemSource;
但是,如果我设置该属性,文本框仍然有效。那么这是一个错误的起点吗?如果有人能提示我一些有关使用 ToStyle 方法中使用的 Style、Setter、Binding 关键字的文档,我也将不胜感激,因为这是我正在使用的其他人的代码。
My goal is to manipulate the text-styles of my application via DependencyProperties. I got a diagram in which the texts are to be manipulated in size, fontfamily, color, etc. So I'd like to use an interface similar to a rich text editor like Word.
I'm using this code in my TextStyleVM http://shevaspace.blogspot.com/2006/12/i-have-some-fun-with-formattedtext_14.html
So I have a FontFamilyProperty and a Getter and Setter for it:
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); }
}
Then there is a ToStyle method, which sets the style for the labels of the diagram, which are to be manipulated:
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;
Now this works for a TextBox. The textbox displays the current FontFamily, and if I enter a new, valid FontFamily like Arial into the textbox the FontFamily of the labels are changed.
However, what I'd like to have is a combobox, which displays the SystemFonts and where I can choose one FontFamily for my labels. However, the binding doesn't seem to work. Neither the system fonts nor the current fonts of the labels are displayed. The combobox is just empty.
This is my 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}"/>
Now, I assume I have to set a different Setter for a ComboBox in the ToStyle Method. But I have no clue, which one. Maybe someting like this:
fontFamilySetter.Property = ComboBox.ItemSource;
However, if I set that Property, the TextBox still works. So is this the wrong place to start at? I'd also be grateful if someone could hint me to some documentation about using these Style-, Setter-, Binding-key-words, which are used in the ToStyle method, since this is somebody elses code I'm working with.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这里的 ItemsSource 需要一个集合;例如 Fonts.SystemFontFamilies
实际上,这里有一个非常好的链接,涵盖字体选择:
http://www.hanselman。 com/blog/LearningWPFWithBabySmashCustomerFeedbackAndAWPFFontComboBox.aspx
Scott Hanselman 甚至展示了如何使用其自己的字体系列呈现组合框中的每个字体项。
根据 OP 评论添加。
下面是绑定到依赖属性的示例。属性被命名为“MyFontFamily”以避免与现有窗口的属性发生冲突。抱歉,没有功能区控件(我只有 3.5 sp1)。
Window1.xaml
Window1.xaml.cs
ItemsSource here expects a collection; e.g. Fonts.SystemFontFamilies
Actually, here's a very nice link covering font selection:
http://www.hanselman.com/blog/LearningWPFWithBabySmashCustomerFeedbackAndAWPFFontComboBox.aspx
Scott Hanselman even shows how to render each font item in combobox with it's own font family.
Added per OP comment.
Here's an example of binding to dependency property. Property is named "MyFontFamily" to avoid collision with existing Window's property. Sorry, no Ribbon controls (I have bare 3.5 sp1).
Window1.xaml
Window1.xaml.cs
一个 Xaml 解决方案,字体按字母顺序排序:
A just in Xaml solution with fonts sorted in alphabetical order:
可以在这里找到一个很棒的 WPF 字体组合框:
CodeProject.com:纯 XAML 字体组合框
它是纯 XAML,可以直接复制/粘贴,甚至可以正确对字体进行排序。这篇文章还很好地描述了遇到的所有问题以及如何解决它们。
A great Font Combobox for WPF can be found here:
CodeProject.com: A XAML-Only Font ComboBox
It is pure XAML, can be just copied/pasted and even sorts the fonts properly. The article also describes nicely all the gotchas encountered and how to solve them.