WPF UserControl vb.net 不会显示自定义字体系列

Posted

技术标签:

【中文标题】WPF UserControl vb.net 不会显示自定义字体系列【英文标题】:WPF UserControl vb.net won't display custom font family 【发布时间】:2017-06-26 12:19:30 【问题描述】:

我不熟悉 VB.net 窗口窗体中的 WPF 互操作性。

我正在制作一个 Windows 窗体应用程序,我正在尝试使用使用自定义字体系列的 ElementHost 添加自定义用户控件。

我创建了一个内部带有标签的自定义按钮,我在其中应用了来自 Google 字体的自定义字体“Raleway”,该字体已加载到资源中。

<UserControl x:Class="ButtonDark"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:prjButtonTestFont"
         mc:Ignorable="d" 
         d:DesignHeight="50" d:DesignWidth="150">

<Button Content="Button" BorderBrush="x:Null" Foreground="x:Null" >
    <Button.Template>
        <ControlTemplate TargetType="x:Type Button">
            <Border x:Name="Border" Background="#ff332d2f" CornerRadius="4" BorderBrush="#ff4e4749" BorderThickness="4">
                <Label x:Name="Labelx" Content="Click" FontFamily="/prjButtonTestFont;component/Resources/#Raleway Thin" HorizontalAlignment="Center" VerticalAlignment="Center"  Foreground="#ff4e4749" FontSize="24" />
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter TargetName="Border" Property="BorderBrush"  Value="green"/>
                    <Setter TargetName="Labelx" Property="Foreground" Value="green"/>
                </Trigger>
                <Trigger Property="IsPressed" Value="true">
                    <Setter TargetName="Border" Property="BorderBrush"  Value="white"/>
                    <Setter TargetName="Labelx" Property="Foreground" Value="white"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>

正确显示字体的 xaml 设计预览图 enter image description here

用户控件按钮显示错误字体的 Windows 窗体图像 enter image description here

问题是我运行应用程序时字体不显示,但在xaml设计预览窗口中会正确显示。

我已经尝试了字体的以下所有文件路径,它们都在 xaml 设计预览窗口中显示了正确的字体,但在我运行应用程序时却没有。

FontFamily="./#Raleway Thin"

FontFamily="/prjButtonTestFont;component/Resources/#Raleway Thin"

FontFamily="../Resources/#Raleway Thin"

FontFamily="../#Raleway Thin"

FontFamily="Raleway-Thin.ttf/#Raleway Thin"

FontFamily="../Resources/Raleway-Thin.ttf/#Raleway Thin"

FontFamily="/prjButtonTestFont;component/Resources/Raleway-Thin.tff/#Raleway Thin"

FontFamily="/Resources/Raleway-Thin.ttf#Raleway Thin"

FontFamily="Raleway-Thin.ttf#Raleway Thin"

FontFamily="Raleway-Thin.TTF#Raleway Thin"

FontFamily="/Resources/Raleway-Thin.TTF#Raleway Thin"

我也尝试过将 FontFamily 应用到相同的结果!

我正在寻找任何解决方案,无论是在 vb 代码中还是通过 xaml 编程。我只需要在应用程序启动后显示字体。

【问题讨论】:

【参考方案1】:

我显示字体的方式是引用字体的绝对路径。每当您使用位于 中的资源(相对于应用程序)时,您几乎总是希望绝对路径

FontFamily="pack://application:,,,/YourAssemblyName;component/Fonts/#Actual Font Name"

编辑:值得一提的是,您提供的所有示例都没有反映有效(绝对)路径。 /prjButtonTestFont;component/Resources/#Raleway Thin 非常接近,但并不完全正确。另外,我会仔细检查字体名称是否有效。为此,只需打开实际的字体文件并确保文档顶部的名称与您的项目中的名称相同。

【讨论】:

绝对路径是指计算机路径“C:/../Resources/Fonts/#Font Name”。我需要该字体在许多计算机上工作,而不仅仅是我现在使用的那个。 不,您将使用我在答案中输入的绝对路径,但将 YourAssemblyName 替换为程序集名称,将 Actual Font Name 替换为字体名称。其他一切都必须相同。【参考方案2】:

这个问题也回答了我的问题 Reference custom view in other project with custom font

问题是“构建操作”未设置为“资源”。为此,请选择“资源”文件夹中的字体,然后在“属性”窗口中将“构建操作”设置为“资源”。

现在字体在程序运行时显示。

【讨论】:

以上是关于WPF UserControl vb.net 不会显示自定义字体系列的主要内容,如果未能解决你的问题,请参考以下文章

WPF UserControl:使多个链接的依赖项属性保持同步,而不会导致递归循环 堆栈溢出

WPF 鼠标按下事件不会触发

WPF 文本框不会触发依赖属性设置器

引用包含在同一 VB.NET 项目中的用户控件

WPF 从 vb.net 代码开始动画给出错误

将 VB.NET 2.0 Winform 迁移到 3.5 WPF