绑定到 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
这解决了我的问题。
我在绑定到静态 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
这解决了我的问题。