从右到左的工具提示文本 c#

3

使用WinForms,我有一个字符串想要设置到一个ToolTip中。该字符串通过Environment.NewLine分隔成多行,如下所示:

x.ToolTipText = "aaaaaa" + Environment.NewLine + "bbb";

当将此字符串设置为ToolTip时,它看起来如下:

aaaaaa
bbb

但我的问题是当我想将其本地化为阿拉伯语时,ToolTip不支持默认的RightToLeft属性,因此它看起来非常糟糕。 我希望它看起来像:

aaaaaa
   bbb

此外:String.PadLeft并没有什么帮助!有什么想法吗?

这是一个ASP.NET工具提示(即在HTML控件上)还是一个WinForms工具提示? - Abel
如果无法进行调整,您可以尝试使用一种丑陋的方法,即添加空格。 - RvdK
4个回答

11

第二次尝试。未能使之前的解决方案正确地工作。通过使用自定义绘制方法来渲染工具提示,找到了替代方法。

设置控件:

string tip = "aaaaaa" + Environment.NewLine + "bbb";           
toolTip1.OwnerDraw = true;
toolTip1.Draw += toolTip1_Draw;
toolTip1.SetToolTip(textBox1, tip);

处理绘图事件:

private void toolTip1_Draw(object sender, DrawToolTipEventArgs e)
{
    e.Graphics.FillRectangle(SystemBrushes.Info, e.Bounds);
    e.DrawBorder();           
    e.DrawText(TextFormatFlags.RightToLeft | TextFormatFlags.Right);
}

3

工具提示控件已经支持此功能。关键是您要显示提示的控件具有从右到左的布局。以下示例表单演示了这一点:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        ToolTip mTip = new ToolTip();
        public Form1() {
            InitializeComponent();
            this.RightToLeft = RightToLeft.Yes;
            this.RightToLeftLayout = true;
        }
        protected override void OnMouseDown(MouseEventArgs e) {
            mTip.Show("Hi\nthere", this);
        }
    }
}

只是好奇,混合RTL / LTR文本如何处理? - Abel
只设置RightToLeft = RightToLeft.Yes是不起作用的。我没有测试过RightToLeftLayout = true,因为它在我的应用程序中无法使用。 - Elmue

3

如果是Windows Forms应用程序,我猜你需要依靠Unicode控制字符来将工具提示文本标记为RTL。

string myToolTipText = "aaaaaa"+Environment.newLine+"bbb";
char rle_char = (char)0x202B;// RLE embedding 
control.RightToLeft = RightToLeft.Yes;
control.ToolTipText = rle_char + myToolTipText;

如果涉及到IT技术,需要翻译内容与RTL应用程序相关。更多信息请参阅此博客

如果是Web应用程序,您可以查看w3c编写RTL应用程序的指南。基本上,解决方案与Windows窗体相同,只需添加RLE字符即可。


很不幸,我没有时间测试它,所以我相信了这篇博客。我找到了另一个解决方案,而且已经成功运行。我在一个新的回复里发布了它。 - PHeiberg

0

这里有一些通用的想法,以便了解正在发生的事情:工具提示类不像多行文本框那样绘制文本。整个工具提示被视为一行,没有绑定矩形,因此RTL与LTR没有意义(除了文本内字符的顺序)。

结果是:使用正常的从右到左或从左到右切换,无论是使用Unicode RTL代码点还是其他方式,都不能帮助对齐:没有应用任何对齐方式。

一种方法是(滥用)TextBox,并将其放置在工具提示的位置上。但其他人已经展示了更漂亮的方式,即使用自绘工具提示,这绝对是正确的方法。


这个答案肯定是错误的。提示文本可能包含换行符,Windows 可以正确地显示它们。提示文本不被认为是“一行”。 - Elmue
@Elmue,这是在2009年的事情了...但是,是的,它很模糊。我想我并不是想暗示工具提示不能_显示_多行(通过使用crlf字符),而是其默认行为不适用于双向内容。正如顶部答案所示,您可以获取工具提示的句柄并更改此行为,但仅适用于整个窗口。它只是不会听取Unicode RTL标记等,不允许内联双向文本。 - Abel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接