8

私の目標は、DependencyPropertiesを介してアプリケーションのテキストスタイルを操作することです。テキストのサイズ、フォントファミリ、色などを操作する図を取得しました。そこで、Wordのようなリッチテキストエディタに似たインターフェイスを使用したいと思います。

私はTextStyleVMでこのコードを使用していますhttp://shevaspace.blogspot.com/2006/12/i-have-some-fun-with-formattedtext_14.html

だから私はFontFamilyPropertyとそれのためのゲッターとセッターを持っています:

        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が表示され、Arialのような新しい有効なFontFamilyをテキストボックスに入力すると、ラベルのFontFamilyが変更されます。

ただし、必要なのはコンボボックスです。このコンボボックスには、SystemFontsが表示され、ラベルに1つの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に別のセッターを設定する必要があると仮定します。しかし、私には手がかりがありません。多分このような何か:

            fontFamilySetter.Property = ComboBox.ItemSource;

ただし、そのプロパティを設定しても、TextBoxは機能します。それで、これは始めるのに間違った場所ですか?また、ToStyleメソッドで使用されるこれらのStyle-、Setter-、Binding-key-wordsの使用に関するドキュメントを誰かに教えてもらえれば幸いです。これは、私が使用している他の誰かのコードだからです。

4

3 に答える 3

17

ここの ItemsSource はコレクションを想定しています。例: Fonts.SystemFontFamilies

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

実際、フォントの選択に関する非常に優れたリンクは次のとおりです。

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

Scott Hanselman は、独自のフォント ファミリを使用してコンボボックス内の各フォント項目をレンダリングする方法も示しています。


OPコメントごとに追加。

依存関係プロパティへのバインドの例を次に示します。プロパティは、既存の Window のプロパティとの衝突を避けるために「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));
}
于 2010-06-01T15:34:56.550 に答える
3

WPF 用の優れたフォント コンボボックスは、次の場所にあります。

CodeProject.com: XAML 専用のフォント コンボ ボックス

これは純粋な XAML であり、コピーして貼り付けるだけで、フォントを適切に並べ替えることができます。この記事では、遭遇したすべての落とし穴とその解決方法についてもうまく説明しています。

于 2013-09-05T07:13:03.853 に答える