[C# WPF] テキストのサイズを算出する

2019年4月18日

まずは手順から。WPFで文字列のサイズを取得する方法です。

スポンサーリンク

XAML側

<Window x:Class="Sample_StringSize.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Sample_StringSize"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <StackPanel>
        <TextBlock x:Name="xTarget1"/>
        <TextBlock x:Name="xResult1"/>
        <TextBlock x:Name="xTarget2"/>
        <TextBlock x:Name="xResult2"/>
    </StackPanel>

</Window>

C#側

using System.Windows;
using System.Windows.Media;

namespace Sample_StringSize
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            {
                xTarget1.Text = "Sample";
                xTarget1.FontSize = 10;

                var formattedText = new FormattedText(
                    xTarget1.Text,
                    System.Globalization.CultureInfo.CurrentCulture,
                    FlowDirection.LeftToRight,
                    new Typeface(xTarget1.FontFamily, xTarget1.FontStyle, xTarget1.FontWeight, xTarget1.FontStretch),
                    xTarget1.FontSize,
                    Brushes.Green
                );

                xResult1.Text = "Width: " + formattedText.Width + " / Height: " + formattedText.Height;
            }

            {
                xTarget2.Text = "Sample";
                xTarget2.FontSize = 100;

                var formattedText = new FormattedText(
                    xTarget2.Text,
                    System.Globalization.CultureInfo.CurrentCulture,
                    FlowDirection.LeftToRight,
                    new Typeface(xTarget2.FontFamily, xTarget2.FontStyle, xTarget2.FontWeight, xTarget2.FontStretch),
                    xTarget2.FontSize,
                    Brushes.Green
                );

                xResult2.Text = "Width: " + formattedText.Width + " / Height: " + formattedText.Height;
            }
        }
    }
}

単純なTextBlockのサイズは、こんな感じに値が取得できます。

表示しないでサイズを算出したい場合は、FormattedTextに設定する値を直接指定すればいいです。

var formattedText = new FormattedText(
    "プリンたべたい",
    System.Globalization.CultureInfo.CurrentCulture,
    FlowDirection.LeftToRight,
    new Typeface(
        new FontFamily("Comic Sans MS"),
        FontStyles.Italic,
        FontWeights.Heavy,
        FontStretches.Expanded
    ),
    10,
    Brushes.Green
);

xResult3.Text = "Width: " + formattedText.Width + " / Height: " + formattedText.Height;

表示してなくても、こんな感じに取得できます。

おしまい。

スポンサーリンク

C#,WPFC#,WPF

Posted by peliphilo