簡體   English   中英

如何格式化C#中MessageBox中顯示的字符串?

[英]How to format a string displayed in a MessageBox in C#?

我想在消息框中顯示一個字符串,格式如下:

機器:TestMachine用戶:UserName

我這樣做:

string strMsg = "Machine  :" + "TestMahine" + "\r\n" +
                "User     :" + "UserName";

MessageBox.Show(strMsg);

當我這樣做時,消息框不會顯示上面格式化的字符串。 冒號(“)不保持alligned。上述格式在WPF TextBlock控件中也不起作用。

請幫忙!!

嘗試這樣的事情:

string strMsg = String.Format("Machine\t: {0}\nUser\t: {1}", "TestMachine", "UserName");

編輯:必須有String.Format那里或最后的孤立支架是悲傷的。

原因是消息框以機器和用戶長度不同的字體顯示。

您可以嘗試以下方法:

"Machine\t:" + "TestMahine" + "\r\n" +
"User\t:" + "UserName";

\\t字符可能會正確對齊您的冒號。

在WPF(或WinForms,或Java,或Qt,或其他任何)TextBlock中,如果要對齊字符,則需要使用固定的字體長度,以使每個字符具有與其他字符相同的長度。

即使用“ Courier New ”或“ Monospaced ”或“ ConsolasMonospaced

在MessageBox中,您無法控制font-family。 如果您真的想要這個功能,您是否考慮過創建自定義的Window組件? 像這樣...

<Window x:Class="WpfApplication1.CustomMessageBox"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        SizeToContent="WidthAndHeight" MaxWidth="500">

    <Grid Margin="10">
        <TextBlock FontFamily="Courier New" Text="{Binding Message}" />
    </Grid>

</Window>  

public partial class CustomMessageBox : Window, INotifyPropertyChanged {
    private string message;
    public string Message {
        get { return message; }
        set { message = value; RaisePropertyChanged("Message"); }
    }

    public CustomMessageBox() {
        InitializeComponent();
        DataContext = this;
    }

    public static void Show(string title, string message) {
        var mbox = new CustomMessageBox();
        mbox.Title = title;
        mbox.Message = message;
        mbox.ShowDialog();
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string property) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
}

因此,您可以使用以下命令調用新的消息框:

string strMsg = 
    "Machine  : " + "TestMahine" + "\r\n" +
    "User     : " + "UserName";

CustomMessageBox.Show("Hello !", strMsg);

當然,您需要對自定義消息框視圖做一些小安排,但您有了想法;-)

我遇到了同樣的問題,試圖在MessageBox對齊數據,在搜索了一段時間后,我決定用TextRenderer.MeasureText編寫自己的方法來獲得像素級別的測量結果。 該方法有兩個參數; 第一個是要格式化的字符串,第二個是要顯示在冒號左側的最長字符串(本例中的對齊字符)。 該方法正在做的是預先填充空格,直到字符串到達​​,但不超過最長字符串的長度。 調用該方法如下所示,其中“Department:”是最長的字符串。

StringBuilder sb = new StringBuilder();
string longest = "Department:  ";
sb.AppendLine(StringLengthFormat("Result(s):  ", longest) + results);

進行格式化的實際方法是:

private string StringLengthFormat(string inString, string longest)
{
    Size textSizeMax = TextRenderer.MeasureText(longest, System.Drawing.SystemFonts.DefaultFont);
    Size textSizeCurrent = TextRenderer.MeasureText(inString, System.Drawing.SystemFonts.DefaultFont);
    do
    {
        inString = " " + inString;
        textSizeCurrent = TextRenderer.MeasureText(inString, System.Drawing.SystemFonts.DefaultFont);
    } while (textSizeCurrent.Width < textSizeMax.Width);
    return inString;
}

因為我還可以有一行或多行不以“描述”開頭,后跟冒號但仍然需要對齊,我想出了一種使用相同方法格式化這些行的方法。 我使用回車符和制表符"\\r\\t"連接數據,然后用我的方法替換制表符"\\t" 請注意 ,我在此示例中包含冒號后面的兩個空格,以便為格式化方法提供一些內容,並在格式化字符串之前修剪尾隨的"\\r\\t" 完整的代碼部分如下所示,后面是該代碼創建的示例MessageBox輸出的鏈接。

string results = "";
StringBuilder sb = new StringBuilder();
string longest = "Department:  ";
foreach (EncounterInfo enc in lei)
{
    results += enc.Description + " " + enc.ResultValue + " " + enc.ResultUnits + "\r\t";
}
results = results.TrimEnd(new char[] { '\r', '\t' });
results = results.Replace("\t", StringLengthFormat("  ", longest));
sb.AppendLine(StringLengthFormat("Result(s):  ", longest) + results);
sb.AppendLine(StringLengthFormat("Patient:  ", longest) + ei.PatientName);
sb.AppendLine(StringLengthFormat("Accession:  ", longest) + ei.AccessionNumber);
sb.AppendLine(longest + ei.CollectionClassDept);
sb.AppendLine();
sb.AppendLine("Continue?");
dr = MessageBox.Show(sb.ToString(), "Add to Encounters", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

示例MessageBox具有字符串長度格式

根據Terrence Meehan指定的方法,我重寫了StringLengthFormat方法,如下所示:

using System.Drawing;
using System.Windows.Forms;

enum Alignment { Left = 0, Right = 1};

static string StringLengthFormat(string inputString, string longestString, 
                                          Alignment alignment=Alignment.Left, string margin="")
{
    Size textSizeMax = TextRenderer.MeasureText(longestString + margin, SystemFonts.MessageBoxFont);
    Size textSizeCurrent = TextRenderer.MeasureText(inputString, SystemFonts.MessageBoxFont);

    do
    {
        if (alignment == Alignment.Left)
        {
            inputString += " ";
        }
        else
        {
            inputString = " " + inputString;
        }

        textSizeCurrent = TextRenderer.MeasureText(inputString, SystemFonts.MessageBoxFont);
    } while (textSizeCurrent.Width < textSizeMax.Width);

    return inputString;
}

差異如下:

  1. 而不是System.Drawing.SystemFonts.DefaultFont ,我使用System.Drawing.SystemFonts.MessageBoxFont ;
  2. 參數margin設置列之間的距離(通過傳輸所需的空格數);
  3. 參數alignment設置列中的對齊方式(左側或右側)。 如果需要,可以補充代碼,以便也顯示中心對齊選項。

tring strMsg =“Machine:”+“TestMahine \\ t \\ nUser:”+“UserName”; MessageBox.Show(strMsg);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM