Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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# 如何避免在固定高度和宽度的WPF文本框中剪切文本?_C#_Asp.net_Wpf_Asp.net Core - Fatal编程技术网

C# 如何避免在固定高度和宽度的WPF文本框中剪切文本?

C# 如何避免在固定高度和宽度的WPF文本框中剪切文本?,c#,asp.net,wpf,asp.net-core,C#,Asp.net,Wpf,Asp.net Core,如果文本大小大于框的宽度或高度,我将尝试自动缩放字体大小。 我正在这样做 //不包括文本框填充和边距 if(格式化的text.width,包括trailingwhitespace>textbox.ActualWidth) { 做 { //逐步减小字体大小 fontSize-=1.0; //设置fontsize以备重新测量 formattedText.SetFontSize(fontSize); }while((formattedText.WidthIncludingTrailingWhitesp

如果文本大小大于框的宽度或高度,我将尝试自动缩放字体大小。 我正在这样做

//不包括文本框填充和边距
if(格式化的text.width,包括trailingwhitespace>textbox.ActualWidth)
{
做
{
//逐步减小字体大小
fontSize-=1.0;
//设置fontsize以备重新测量
formattedText.SetFontSize(fontSize);
}while((formattedText.WidthIncludingTrailingWhitespace>
textbox.ActualWidth)和&(fontSize>minimumFontSize));
}
myTextBox.FontSize=FontSize;
返回字体大小

但文本正在被剪裁或裁剪。 请参阅附加的快照 红色标记是文本框的边框。 有人能建议我该怎么做吗? 我也试过了
if(formattedText.Width>textbox.ActualWidth)
if(formattedText.Extent>textbox.ActualWidth)


谢谢

要使用多行文本框,您需要做一些额外的事情

  • 您需要在格式化文本上设置一个
    MaxTextWidth
    ,以便正确计算高度
  • 如果您的
    文本框
    样式有
    填充
    请确保在
    宽度
    高度
    计算中考虑到这一点
以下是一个工作示例:

private void AdjustText()
{
    var dpiInfo = VisualTreeHelper.GetDpi(MyTextBox);

    var fontSize = MyTextBox.FontSize;
    var minimumFontSize = 8;

    var typeface = new Typeface(MyTextBox.FontFamily,
        MyTextBox.FontStyle,
        MyTextBox.FontWeight,
        MyTextBox.FontStretch);

    var formattedText = new FormattedText(
        MyTextBox.Text,
        Thread.CurrentThread.CurrentCulture,
        MyTextBox.FlowDirection,
        typeface,
        fontSize,
        MyTextBox.Foreground,
        dpiInfo.PixelsPerDip);

    formattedText.MaxTextWidth = MyTextBox.Width - (MyTextBox.Padding.Left + MyTextBox.Padding.Right);

    if (formattedText.Height > MyTextBox.Height - (MyTextBox.Padding.Top + MyTextBox.Padding.Bottom))
    {
        do
        {
            // reduce font size by step
            fontSize -= 2.0;
            // set fontsize ready for re-measure
            formattedText.SetFontSize(fontSize);
        } while (formattedText.Height > MyTextBox.Height - (MyTextBox.Padding.Top + MyTextBox.Padding.Bottom) && fontSize > minimumFontSize);

        MyTextBox.FontSize = fontSize;
    }
}

尝试将TextBox(或TextBlock?)放入Viewbox。感谢您的响应,是否可以通过编程方式将其放入Viewbox?当然,请参见此处:这是为了更新stackoverflow社区,下面@Keithernet提供的解决方案在大多数情况下都可以正常工作,但当文本为粗体时,问题会复制。请看一看屏幕截图屏幕截图字体大小是9,尽管最小字体大小限制是06。不幸的是,我不使用.NET Core 2.2,所以我不知道。我能够成功运行此功能,而且它也工作正常。但是当我改变reductionStep
fontSize-=2.0
fontSize-=0.2相同的问题重复出现。因此,对于文本的动态长度和大小,它也可以用
fontSize-=2.0进行复制可能吗?ThanksWPF在字体大小和缩放方面一直存在内部数学问题。我不知道FormattedText在内部是如何工作的,所以很难说。嗨,Keithernet,我只是想问一下,你能不能提出一些好的方法来动态减少字体大小,而不是硬编码的值I-e 0.2或2.0?谢谢你的支持,现在回复已经很晚了,但是对于其他犯同样错误的人来说可能会觉得很有帮助。我能够修复formattedText对象中正在通过的“Verdana”是回退字体系列,这导致修复了这一文本问题:)因此,正是这种字体在计算formattedText的精确高度和宽度时遇到了麻烦