Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# 设置MaxTextWidth时WPF字对齐问题_C#_Wpf - Fatal编程技术网

C# 设置MaxTextWidth时WPF字对齐问题

C# 设置MaxTextWidth时WPF字对齐问题,c#,wpf,C#,Wpf,我正在使用FormattedText显示文本。我需要按照提供的选项水平对齐文本。在我设置“MaxTextWidth”属性之前,一切都很正常(我需要这个来修剪单词)。如何在启用单词修剪的情况下对齐文本 FormattedText formatted_text = new FormattedText( text, System.Globalization.CultureInfo.GetCultureInfo("en-US"), FlowDire

我正在使用FormattedText显示文本。我需要按照提供的选项水平对齐文本。在我设置“MaxTextWidth”属性之前,一切都很正常(我需要这个来修剪单词)。如何在启用单词修剪的情况下对齐文本

    FormattedText formatted_text = new FormattedText(
            text, System.Globalization.CultureInfo.GetCultureInfo("en-US"),
            FlowDirection.LeftToRight,
            typeface, em_size, brush);
   formatted_text.TextAlignment = TextAlignment.Right;
   drawingContext.DrawText(formatted_text, origin);
这可以很好地按照预期对齐代码。但是我需要修剪单词w.r.t MaxTextWidth。我在设置MaxTextWidth时遇到问题。如何计算MaxTextWidth

图像中的点是原点

这是我不设置MaxTextWidth时得到的结果

当我将MaxTextWidth设置为100时,会出现这种情况

如何计算MaxTextWidth以便对齐修剪过的句子

编辑:添加更多屏幕截图

在设置MaxTextWidth之前,请正确对齐, 凝固后


我失去了单词对齐,看w.r.t所示的参考点这是一种奇怪的行为 那个 对源代码有影响。 如果
FormattedText
右对齐且
MaxTextWidth=0
,即默认值,
DrawText
将 文本左起。如果
MaxTextWidth>0
DrawText
将文本置于原点右侧

因此,如果右对齐,则必须从
origin.X
中减去
MaxTextWidth
如果中间有一半。这里有一个例子。蓝色圆点是期望的原点,红色圆点是校正的原点。


MaxTextWidth
添加到原点的X坐标是一种奇怪的行为。是否要计算最长单词的宽度?将MaxTextWidth设置为最长单词的宽度可以解决此问题吗?我正在尝试了解您要解决的问题。您能编辑您的问题并准确描述所需的对齐方式吗?我正在将单词向右对齐(为了理解,我在这里使用一个参考点),因此理想情况下,我的修剪文本应该与图1中的对齐方式相同,但事实并非如此。设置MaxTextWidth会使我的文本偏离参考点。请参阅我答案图像中的最后一段。你有的是红点。你在找蓝点,是吗?然后,在我的代码示例的末尾,您需要
correctionX
。伙计,您的回答解决了我的问题,非常感谢!简而言之,这就是我所需要的:如果右对齐,则必须从原点减去MaxTextWidth.X,如果居中,则必须减去一半。如何修复RTL文本中的对齐方式@贝泽德,我从来没有处理过RTL文本。您可以在上面的代码中更改
FlowDirection
参数,并查看它是否有影响。
using System.Windows;
using System.Windows.Media;

public void DrawTextTest(DrawingContext dc) {
    var y = 100.0;
    foreach (var align in new TextAlignment[]{
        TextAlignment.Left, TextAlignment.Center, TextAlignment.Right}) {
        foreach (var width in new double[] { 0.0, 150.0 }) {
            DrawText(dc, new Point(400, y), align, width);
            y += 25.0;
        }
        y += 45.0;
    }
}

private void DrawText(DrawingContext dc, Point origin,
    TextAlignment align, double maxTextWidth) {
    var f = new FormattedText(
        "This is a text with TextAlignment = " + align.ToString()
            + " and MaxTextWidth = " + maxTextWidth.ToString() + ".",
        System.Globalization.CultureInfo.CurrentCulture,
        FlowDirection.LeftToRight,
        new Typeface("Arial"), 12.0, Brushes.Black
    ) {
        TextAlignment = align,
        MaxTextWidth = maxTextWidth
    };

    dc.DrawEllipse(Brushes.Blue, null, origin, 1.0, 1.0);
    var correctionX = -maxTextWidth * (align == TextAlignment.Right ? 1.0
        : (align == TextAlignment.Center ? 0.5 : 0.0));
    origin.Offset(correctionX, 0.0);
    dc.DrawEllipse(Brushes.Red, null, origin, 1.0, 1.0);
    dc.DrawText(f, origin);
}