Создание диалога шрифтов. Как я могу отобразить каждый шрифт с его дизайном? - PullRequest
2 голосов
/ 05 января 2011

Вот мой код:

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 ]

1 голос
/ 05 января 2011

Во-первых, я хочу убедиться, что вам известно об элементе управления FontDialog, и вы намеренно хотите создать собственный диалог шрифтов. Если вы не знали об этом, то, возможно, вы можете взглянуть на него и убедиться, что он не соответствует вашим потребностям, прежде чем пытаться создать свои собственные. И следующий вопрос переполнения стека показывает, как убедиться, что он заполнен всеми шрифтами устройства, а не только шрифтами TrueType.

Теперь, если вы все еще хотите создать свой собственный, то ниже приведено упрощенное решение:

  1. Добавьте ярлык к своему диалоговому окну шрифта и установите его текст таким, какой вы хотите, чтобы пользователь видел в качестве образца шрифта. Что-то вроде AabBcC, или это может быть случайное предложение.

  2. Вы можете установить шрифт метки в событии SelectedIndexChanged вашего ListBox. По сути, это изменяет образец текста в соответствии с указанным шрифтом. Ниже приведен простой пример:

Обратите внимание, что вы также можете использовать текстовое поле, если хотите, чтобы ваш пользователь указал текст, который он хочет видеть другим шрифтом. Кроме того, некоторые шрифты, такие как Andy и Aharomi, выдают исключение ArgumentException, заявляя, что шрифт не поддерживает обычный стиль, поэтому было бы целесообразно перехватить этот тип исключения.

private void lstFonts_SelectedIndexChanged(object sender, EventArgs e)
{
    lblSample.Font = new Font(lstFonts.SelectedItem.ToString(), 12);
}
1 голос
/ 05 января 2011

Вы можете сделать это легко в WPF.

XAML будет выглядеть так:

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

и код C #:

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

Вы также можете проверить эту статью в CodeProject, в котором рассказывается (в примере с Winforms), как заполнять список со шрифтами так, как вы хотите:

1 голос
/ 05 января 2011

Может, пойти с ListView вместо ListBox?Тип ListViewItem имеет свойство Font, которое вы можете использовать.Мне не известны какие-либо специальные возможности форматирования для каждого элемента: ListBox.


Обновление : если вы все еще работаете над этим, фрагмент кода, который работал для меня (он не будет скомпилирован как есть, поскольку это всего лишь клип из более крупного пользовательского элемента управления; я уверен, что вы можете выяснить, что и куда идет):

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

0 голосов
/ 05 января 2011

Используя ListBox, я бы подумал, что вам нужно сделать рисование владельцем.При рисовании каждого элемента списка вам нужно выбрать шрифт для этого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...