none
Настройка шрифта в WPF RRS feed

  • Вопрос

  • Необходимо предоставить пользователю возможность настройки шрифта для вывода текста в InkCanvas. Читаю о том, как это можно сделать, т.к. в WPF нет аналога FontDialog: реализовать свой FontDialog; использовать FontDialog из WinForms. Первый вариант совсем не понравился, решил воспользоваться вторым. Для этого пишу следующий код:

    System.Windows.Forms.FontDialog myFontDialog = new FontDialog();
                if (myFontDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
    
                    TextBlock textBlock1 = new TextBlock();
                    textBlock1.Text = "TextBlock content";
                    textBlock1.FontFamily = new System.Windows.Media.FontFamily(myFontDialog.Font.FontFamily.ToString());
                    textBlock1.FontSize = myFontDialog.Font.Size;
                    switch (myFontDialog.Font.Style)
                    {
                        case (System.Drawing.FontStyle.Italic):
                            {
                                textBlock1.FontStyle = System.Windows.FontStyles.Italic;
                                break;
                            }
                        case (System.Drawing.FontStyle.Regular):
                            {
                                textBlock1.FontStyle = System.Windows.FontStyles.Normal;
                                break;
                            }
                        case (System.Drawing.FontStyle.Bold):
                            {
                                textBlock1.FontWeight = System.Windows.FontWeights.Bold;
                                break;
                            }
    
                            //case(System.Drawing.FontStyle.Bold + " " + System.Drawing.FontStyle.Italic)
                    }
                    inkCanvas1.Children.Add(textBlock1);
                }
    

    Семейство шрифтов, размер устанавливаются те, которые и должны быть, а вот с начертанием небольшие проблемы: если выбранное начертание равно Italic, Regular или Bold, то все нормально, но если начертание Bold+Italic, то получаем фиаско. Пробовал делать преобразование ToString() в switch и case(в частности, последний закомментированный case), но от VS получаю ошибки: "Требуется постоянное значение".

    Как в  WPF средствами языка C# предоставить пользователю возможность полной настройки шрифта? Может быть есть специальные WPF-библиотеки, содержащие FontDialog? На MSDN(http://msdn.microsoft.com/en-us/library/ms771765%28v=vs.85%29.aspx) есть реализация Font Dialog Box Demo, но она сделана под .NET 3.5

    • Перемещено Abolmasov Dmitry 6 февраля 2012 г. 10:48 (От:Языки программирования)
    29 января 2012 г. 4:41

Ответы

Все ответы

  • Немного помучившись, написал по "топорной методике" следующий код, который позволяет вставлять в InkCanvas текст с заданными параметрами форматирования(семейство шрифта, размер и т.д.), но он мне несколько не нравится - крайне смущают вложенные условные блоки:

    System.Windows.Forms.FontDialog myFontDialog = new FontDialog();
                if (myFontDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
    
                    TextBlock textBlock1 = new TextBlock();
                    textBlock1.Text = "TextBlock content";
                    textBlock1.FontFamily = new System.Windows.Media.FontFamily(myFontDialog.Font.FontFamily.Name);
                    textBlock1.FontSize = myFontDialog.Font.Size;
    
                    if(myFontDialog.Font.Style.ToString()==System.Drawing.FontStyle.Italic.ToString())
                    {
                        textBlock1.FontStyle = System.Windows.FontStyles.Italic;                    
                    }
                    else
                    {
                        if(myFontDialog.Font.Style.ToString()==System.Drawing.FontStyle.Regular.ToString())
                        {
                            textBlock1.FontStyle = System.Windows.FontStyles.Normal; 
                        }
                        else
                        {
                            if(myFontDialog.Font.Style.ToString()==System.Drawing.FontStyle.Bold.ToString())
                            {
                                textBlock1.FontWeight = System.Windows.FontWeights.Bold;
                            }
                            else
                            {
                                if(myFontDialog.Font.Style.ToString()==System.Drawing.FontStyle.Bold.ToString() + ", " + System.Drawing.FontStyle.Italic.ToString())
                                {
                                    textBlock1.FontStyle = System.Windows.FontStyles.Italic;
                                    textBlock1.FontWeight = System.Windows.FontWeights.Bold;
                                }
                            }
                        }
                    }
    
                    
                    if(myFontDialog.Font.Strikeout)
                    {                    
                        textBlock1.TextDecorations.Add(TextDecorations.Strikethrough);
                    }
                    if(myFontDialog.Font.Underline)
                    {
                        textBlock1.TextDecorations.Add(TextDecorations.Underline);
                    }
    
                    inkCanvas1.Children.Add(textBlock1);
    
    
    Неужели WPF не имеет более изящных способов вставки текста?

    29 января 2012 г. 6:11
  • Здравствуйте.

    На MSDN есть отличное демо, показывающее как создать диалог выбора шрифта и как применить выбранный шрифт.

    Посмотрите данный пример - Пример диалогового окна шрифтов (скачать пример)


    Для связи [mail]
    • Предложено в качестве ответа PashaPash 30 января 2012 г. 16:40
    • Помечено в качестве ответа Maximys33 31 января 2012 г. 6:08
    29 января 2012 г. 22:15