绑定到 WPF 中的静态字体

Binding to a static font in WPF

我在绑定到静态 FontFamily 时遇到问题。

这里有一些关于我实际在做什么的信息。 在应用程序中,我希望用户选择他们的字体。所以我允许他们在开始时选择字体,然后将其保存到文件中(以便在用户下次打开应用程序时保存字体。)然后我从文件中读取并将字体存储在静态变量中class'Fonts'。当我使用 MessageBoxes 显示它工作的字体时。所以唯一不起作用的是我对字体的绑定。请看一下。

public class Fonts
{
    private static FontFamily _titleFont;

    /// <summary>
    /// A static property which you'd like to bind to
    /// </summary>
    public static FontFamily titleFont
    {
        get
        {
            return _titleFont;
        }

        set
        {
            _titleFont = value;

            // Raise a change event
            OnTitleFontChanged(EventArgs.Empty);
        }
    }

    // Declare a static event representing changes to your static property
    public static event EventHandler TitleFontChanged;

    // Raise the change event through this static method
    protected static void OnTitleFontChanged(EventArgs e)
    {
        EventHandler handler = TitleFontChanged;

        if (handler != null)
        {
            handler(null, e);
        }
    }
    static Fonts()
    {
        // Set up an empty event handler
        TitleFontChanged += (sender, e) => { return; };

    }

}

然后在 window 的启动方法中设置静态变量如下:

Fonts.titleFont = new FontFamily(new Uri("pack://application:,,,/Fonts/#Aldrich", UriKind.Absolute), "Aldrich");

Textblocks fontfamily 设置如下:

<TextBlock x:Name="CurrentUserStatsTitle" FontSize="36" Text="Welcome, " Foreground="White" FontFamily="{Binding Path=(local:Fonts.titleFont)}"/>

外观:

它应该是什么样子:

更新:

这就是代码现在的样子。一切运行良好,但我的绑定仍然无法正常工作。我做错了什么吗?如果是的话,你能解释一下或给我发一个 link 来解释解决方案吗?

public class Fonts
{
    private static FontFamily _titleFont;

    /// <summary>
    /// A static property which you'd like to bind to
    /// </summary>
    public static event PropertyChangedEventHandler StaticPropertyChanged;

    public static FontFamily TitleFont
    {
        get { return _titleFont; }
        set
        {
            _titleFont = value;
            StaticPropertyChanged?.Invoke(null,
                new PropertyChangedEventArgs(nameof(TitleFont)));
        }
    }

    private static FontFamily _subTitleFont;

    /// <summary>
    /// A static property which you'd like to bind to
    /// </summary>
    public static FontFamily SubTitleFont
    {
        get { return _subTitleFont; }
        set
        {
            _subTitleFont = value;
            StaticPropertyChanged?.Invoke(null,
                new PropertyChangedEventArgs(nameof(SubTitleFont)));
        }
    }

    private static FontFamily _descriptionFont;

    /// <summary>
    /// A static property which you'd like to bind to
    /// </summary>
    public static FontFamily DescriptionFont
    {
        get { return _descriptionFont; }
        set
        {
            _descriptionFont = value;
            StaticPropertyChanged?.Invoke(null,
                new PropertyChangedEventArgs(nameof(DescriptionFont)));
        }
    }
    static Fonts()
    {
        StaticPropertyChanged += (sender, e) => { return; };
    }
}

您的静态 属性 与其更改的事件之间存在名称不匹配。

如果属性被命名为titleFont,对应的事件必须被命名为titleFontChanged

当然还有广泛接受的命名约定,根据这些约定,属性 名称应使用 Pascal 大小写,即以大写字母开头。

所以 属性 最好命名为 TitleFont


IMO,实现静态 属性 更改通知的更好解决方案是为所有静态属性设置一个 StaticPropertyChanged 事件:

public static event PropertyChangedEventHandler StaticPropertyChanged;

public static FontFamily TitleFont
{
    get { return _titleFont; }
    set
    {
        _titleFont = value;
        StaticPropertyChanged?.Invoke(null,
            new PropertyChangedEventArgs(nameof(TitleFont)));
    }
}

感谢 Clemens 和 Andy,我找到了答案。

Clemens 提供的代码运行良好。但是问题是我使用相对路径时出现内存泄漏

我按照以下网站上的说明进行操作: https://github.com/ButchersBoy/MaterialDesignInXamlToolkit/issues/746

这解决了我的问题。