Как отформатировать строку, отображаемую в MessageBox в C #? - PullRequest
4 голосов
/ 26 октября 2010

Я хочу отобразить строку в окне сообщения в следующем формате:

Машина: TestMachine Пользователь: UserName

Я делаю это:

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

MessageBox.Show (strMsg);

Когда я делаю это, в окне сообщения не отображается строка, как указано выше. Двоеточие (") не сохраняет выравнивание. Приведенный выше формат также не работает в элементе управления WPF TextBlock.

Пожалуйста, помогите !!

Ответы [ 5 ]

6 голосов
/ 26 октября 2010

Попробуйте что-то вроде этого:

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

Отредактировано: у меня должен быть этот формат String.Format или этот одинокий квадрат в конце печален.

3 голосов
/ 26 октября 2010

Причина этого заключается в том, что окно сообщения отображается шрифтом, в котором длина Machine и User может не совпадать.

Вы можете попробовать следующее:

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

Символ \t, вероятно, правильно выровняет ваши двоеточия.

2 голосов
/ 26 октября 2010

В текстовом блоке WPF (или WinForms, или Java, или Qt, или где-либо еще), если вы хотите, чтобы символы были выровнены, вам нужно использовать фиксированную длину шрифта, чтобы каждый символ имел длину, равнуюдругие.

т.е. используйте шрифт типа "Courier New" или "Monospaced" или "Consolas".

В MessageBox вы не можете управлять шрифтом-семейством.Если вы действительно хотите эту функцию, вы рассматривали возможность создания настраиваемого компонента 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);

Конечно, вы будетенужно немного позаботиться о вашем собственном окне сообщения, но у вас есть идея; -)

1 голос
/ 02 сентября 2018

Я столкнулся с той же проблемой, пытаясь выровнять данные в 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 с форматированием длины строки

0 голосов
/ 26 октября 2010

tring strMsg = "Machine:" + "TestMahine \ t \ nUser:" + "UserName"; MessageBox.Show (strMsg); * * тысяча один

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...