Вертикальное пространство в командных ссылках в TaskDialog начиная с версии 1.1
Я заметил большое вертикальное пространство в диалоге задач (пространство между заголовками командных ссылок и текстами инструкций), которое выглядит очень плохо. Он начал появляться сразу после того, как я обновил WindowsAPICodePack до версии 1.1.
Вот код:
TaskDialog td = new TaskDialog();
var b1 = new TaskDialogCommandLink("b1", "foo", "bar");
var b2 = new TaskDialogCommandLink("b2", "one", "two");
td.Controls.Add(b1);
td.Controls.Add(b2);
td.Caption = "Caption";
td.InstructionText = "InstructionText";
td.Text = "Text";
td.Show();
Вот результат:
Раньше "bar" появлялся прямо под "foo", но теперь это выглядит так, как будто между ними есть пустая строка. Это проблема с моей стороны (и кто-нибудь знает, что это может быть), или вы, ребята, тоже испытываете это?
2 ответа
Я получил ту же ошибку в версии 1.1. Кажется, это связано с TaskDialogCommandLink
класса toString
метод string.Format
с Environment.NewLine
, который не отображается чисто при передаче самому TaskDialog.
public override string ToString()
{
return string.Format(CultureInfo.CurrentCulture, "{0}{1}{2}",
Text ?? string.Empty,
(!string.IsNullOrEmpty(Text) && !string.IsNullOrEmpty(instruction)) ?
Environment.NewLine : string.Empty,
instruction ?? string.Empty);
}
В любом случае я использую подкласс реализации, чтобы упростить аргументы, и перегрузил метод, чтобы передать строку, содержащую простое '\ n', хотя мне не нужно интернационализировать мое приложение, и поэтому я могу делать вещи немного проще.
public override string ToString()
{
string str;
bool noLabel = string.IsNullOrEmpty(this.Text);
bool noInstruction = string.IsNullOrEmpty(this.Instruction);
if (noLabel & noInstruction)
{
str = string.Empty;
}
else if (!noLabel & noInstruction)
{
str = this.Text;
}
else if (noLabel & !noInstruction)
{
str = base.Instruction;
}
else
{
str = this.Text + "\n" + this.Instruction;
}
return str;
}
Я заметил те же проблемы с пробелами в API Code Pack v1.1 в Windows 8. DougM прав, его ToString()
переопределение решит проблему.
Вот обновленная версия, просто поместите этот класс в свой проект и вместо использования TaskDialogCommandLink
использовать TaskDialogCommandLinkEx
вместо.
using Microsoft.WindowsAPICodePack.Dialogs;
internal class TaskDialogCommandLinkEx : TaskDialogCommandLink
{
public override string ToString()
{
string str;
var noLabel = string.IsNullOrEmpty(Text);
var noInstruction = string.IsNullOrEmpty(Instruction);
if (noLabel & noInstruction)
{
str = string.Empty;
}
else if (!noLabel & noInstruction)
{
str = Text;
}
else if (noLabel & !noInstruction)
{
str = Instruction;
}
else
{
str = Text + "\n" + Instruction;
}
return str;
}
}