我想在消息框中显示一个字符串,格式如下:
机器:TestMachine用户:UserName
我这样做:
string strMsg = "Machine :" + "TestMahine" + "\r\n" +
"User :" + "UserName";
MessageBox.Show(strMsg);
当我这样做时,消息框不会显示上面格式化的字符串。冒号(“)不保持对齐。上述格式在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
”或“Consolas
”等字体。
在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);
tring strMsg =“Machine:”+“TestMahine \ t \ nUser:”+“UserName”; MessageBox.Show(strMsg);