创建字体对话框。如何使用其设计显示每种字体?

时间:2011-01-05 16:32:37

标签: c# winforms fonts

这是我的代码:

private void DialogFont_Load(object sender, EventArgs e)
{
    LoadInstalledFonts();
}

private void LoadInstalledFonts()
{
    var fontCollection = new System.Drawing.Text.InstalledFontCollection();
    foreach (var font in fontCollection.Families)
    {
        lstFonts.Items.Add(font.Name);
    }
}

如何使用自己的设计显示每种字体,有点像字体的预览?我正在使用ListBox控件列出字体。

4 个答案:

答案 0 :(得分:1)

也许选择ListView代替ListBoxListViewItem类型具有您可以使用的Font属性。我不知道ListBox的任何特殊的每项项目格式化功能。


更新:如果您还在处理此问题,here's a snippet of some code that worked for me(这不会按原样编译,因为它只是来自较大用户控件的剪辑;我是确定你能弄清楚究竟发生了什么):

private void PopulateListView(IEnumerable<FontFamily> fontFamilies)
{
    try
    {
        m_listView.BeginUpdate();

        float fontSize = m_listView.Font.Size;
        Color foreColor = m_listView.ForeColor;
        Color backColor = m_listView.BackColor;
        string sampleText = m_sampleText;

        foreach (FontFamily fontFamily in fontFamilies)
        {
            var listViewItem = new ListViewItem(fontFamily.Name)
            {
                UseItemStyleForSubItems = false
            };

            var sampleSubItem = new ListViewItem.ListViewSubItem(listViewItem, sampleText, foreColor, backColor, new Font(fontFamily, fontSize));

            listViewItem.SubItems.Add(sampleSubItem);

            m_listView.Items.Add(listViewItem);
        }
    }
    finally
    {
        m_listView.EndUpdate();
    }
}

结果如下:

FontListView control

答案 1 :(得分:1)

您可以在WPF中轻松完成。

XAML看起来像:

<ComboBox Width="100" Height="30" x:Name="FontSelector">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" FontFamily="{Binding}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

和C#codebehind:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    FontSelector.ItemsSource = Fonts.SystemFontFamilies;
}

您还可以在CodeProject上查看本文,该文章介绍了(在Winforms示例中)如何使用您想要的字体填充列表框:http://www.codeproject.com/KB/selection/FontListBoxAndCombo.aspx

答案 2 :(得分:1)

首先,我想确保您了解FontDialog控件,并且您特意想要创建自定义字体对话框。如果你不了解它,那么也许你可以看看它,并确保它不符合你的需求,然后再尝试创建自己的。以下Stack Overflow question向您展示了如何确保它填充了所有设备字体而不仅仅是TrueType字体。

现在,如果您仍想创建自己的,那么以下是一个简化的解决方案:

  1. 在“字体”对话框中添加标签,并将其文本设置为您希望用户将其视为字体样本的任何内容。像AabBcC这样的东西,或者它甚至可以是一个随机的句子。

  2. 您可以在ListBox的SelectedIndexChanged事件中设置标签的Font。这实际上会更改示例文本以匹配您指定的字体。以下是一个简单的例子:

  3. 请注意,如果您希望用户指定要以其他字体查看的文本,也可以使用文本框。此外,Andy和Aharomi等一些字体会抛出一个ArgumentException,声明Font不支持常规样式,因此捕获此异常类型是明智的。

    private void lstFonts_SelectedIndexChanged(object sender, EventArgs e)
    {
        lblSample.Font = new Font(lstFonts.SelectedItem.ToString(), 12);
    }
    

答案 3 :(得分:0)

使用ListBox,我认为你需要做主人画。绘制每个列表项时,您需要选择该项的字体。