Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 串宽测量方法不准确_C#_.net_Wpf_String - Fatal编程技术网

C# 串宽测量方法不准确

C# 串宽测量方法不准确,c#,.net,wpf,string,C#,.net,Wpf,String,我正在尝试将RichTextBox.PageWidth的大小限制为每行60个字符(固定宽度字体)。基本上,我测量字符串,然后将PageWidth设置为测量的量 当我使用它时,我的测量值相差2个字符。(最后2个字符换行到下一行。) 有人知道我如何在不将文本放入RichTextBox的情况下获得RichTextBox的字符串宽度吗 字符串测量方法(取自): 更新: 进一步的测试表明,它始终关闭2个字符(对于4个字符或100个字符)。这让我相信RichTextBox在填充某些内容。很可能RichTex

我正在尝试将RichTextBox.PageWidth的大小限制为每行60个字符(固定宽度字体)。基本上,我测量字符串,然后将PageWidth设置为测量的量

当我使用它时,我的测量值相差2个字符。(最后2个字符换行到下一行。)

有人知道我如何在不将文本放入RichTextBox的情况下获得RichTextBox的字符串宽度吗

字符串测量方法(取自):

更新:

进一步的测试表明,它始终关闭2个字符(对于4个字符或100个字符)。这让我相信RichTextBox在填充某些内容。

很可能RichTextBox为了自己的布局目的消耗了一些水平宽度,导致您的计算总是有点短。这个问题的答案应该能帮助你解决问题


可能RichTextBox为了自己的布局而占用了一些水平宽度,这会导致您的计算总是有点短。这个问题的答案应该能帮助你解决问题


我使用这种方法,它可能不是最好的,但非常准确

    private double MeasureText(string text, FontFamily font, double fontsize)
    {
        var mesureLabel = new TextBlock(); 
        mesureLabel.FontFamily = font;
        mesureLabel.FontSize = fontsize; 
        mesureLabel.Text = text; 
        mesureLabel.Padding = new Thickness(0); 
        mesureLabel.Margin = new Thickness(0); 
        mesureLabel.Width = double.NaN; 
        mesureLabel.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 
        mesureLabel.Arrange(new Rect(mesureLabel.DesiredSize));
        return mesureLabel.ActualWidth;
    }
用法:

 double length = MeasureText("hello", FontFamily, FontSize);

我使用这种方法,它可能不是最好的,但它非常准确

    private double MeasureText(string text, FontFamily font, double fontsize)
    {
        var mesureLabel = new TextBlock(); 
        mesureLabel.FontFamily = font;
        mesureLabel.FontSize = fontsize; 
        mesureLabel.Text = text; 
        mesureLabel.Padding = new Thickness(0); 
        mesureLabel.Margin = new Thickness(0); 
        mesureLabel.Width = double.NaN; 
        mesureLabel.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 
        mesureLabel.Arrange(new Rect(mesureLabel.DesiredSize));
        return mesureLabel.ActualWidth;
    }
用法:

 double length = MeasureText("hello", FontFamily, FontSize);

你不能只使用TextRenderer.MeasureText吗?也许我遗漏了什么,但是除非你使用像Courier这样的固定宽度字体,否则60个字符的宽度取决于这些字符是什么。使用数字作为代理只能给出一个估计。“如果它在”通常会比“哇哇哇”占用更少的水平空间。@reedparkes-是的,我可以。但我不想加载那个DLL(这是一个“WinForms”DLL,这是WPF应用程序)。@hatchet-我更新了我的问题,表明这是使用固定宽度字体。抱歉@Vaccano,我完全错过了。你不能只使用TextRenderer.MeasureText吗?也许我遗漏了一些东西,但除非你使用像Courier这样的固定宽度字体,60个字符的宽度取决于这些字符是什么。使用数字作为代理只能给出一个估计。“如果它在”通常会比“哇哇哇”占用更少的水平空间。@reedparkes-是的,我可以。但我不想加载那个DLL(这是一个“WinForms”DLL,这是WPF应用程序)。@hatchet-我更新了我的问题,表明这是使用固定宽度字体。抱歉@Vaccano,我完全错过了。