gpt4 book ai didi

wpf - 在组合框中显示 FontFamily

转载 作者:行者123 更新时间:2023-12-01 21:11:36 29 4
gpt4 key购买 nike

我的目标是通过 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。但是,绑定(bind)似乎不起作用。系统字体和标签的当前字体均不显示。组合框只是空的。

这是我的 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-key-words 关键字的文档,我也将不胜感激,因为这是我正在使用的其他人的代码。

最佳答案

这里的 ItemsSource 需要一个集合;例如字体.SystemFontFamilies

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

实际上,这是一个非常好的链接,介绍了字体选择:

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

Scott Hanselman 甚至展示了如何使用其自己的字体系列呈现组合框中的每个字体项。

<小时/>

根据 OP 评论添加。

这是绑定(bind)到依赖属性的示例。属性被命名为“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));
}

关于wpf - 在组合框中显示 FontFamily,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2950078/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com