Ответ 1
Быстрый и грязный пользовательский контроль с изображением и отдельной меткой - ваш лучший вариант. Просто добавьте свойство публичной строки, чтобы установить текст ярлыка, и вы в значительной степени сделали.
Я хочу сообщить о состоянии операции в приложении WinForm, написанном на С#. Чтобы сделать его более удобным для пользователя, я хочу показать значок слева в зависимости от состояния.
Я хотел использовать собственный элемент управления LabForms Label, который хорошо работает с анимированными GIF файлами и выглядит стандартно, как он может получить.
Однако моя проблема заключается в том, что текст нарисован над изображением. Кажется, что нет никакого свойства для установки поля для текста. Я пробовал наиболее очевидную вещь, которая предназначена для префикса его пробелами, которая работает, за исключением случаев, когда текст переносится на следующую строку, как показано ниже.
Я бы предпочел не тратить слишком много времени на запись/тестирование/отладку производного элемента управления для этого, если это возможно... Я мог бы установить быстрый и грязный пользовательский контроль с изображением слева от ярлыка, но он не очень чистый.
Есть ли какой-либо трюк, чтобы обойти это быстро и элегантно, или кто-то может указать мне на класс, основанный на методе, поддерживающий это относительно легкое? (Я смотрел CodeProject, но не мог найти много).
Спасибо.
Быстрый и грязный пользовательский контроль с изображением и отдельной меткой - ваш лучший вариант. Просто добавьте свойство публичной строки, чтобы установить текст ярлыка, и вы в значительной степени сделали.
Простой альтернативой является использование Button
вместо Label
, как показано ниже:
Используя следующие свойства, вы можете стилизовать Button
, чтобы выглядеть так же, как Label
, в то же время имея возможность сохранить изображение и текст, выровненные рядом друг с другом:
FlatAppearance ↴
BorderSize = 0
MouseDownBackColor = Control
MouseOverBackColor = Control
FlatStyle = Flat
Image = [Your image]
ImageAlign = MiddleLeft
Text = [Your text]
TextAlign = MiddleLeft
TextImageRelation = ImageBeforeText
Простой способ добиться желаемого эффекта; без контроля пользователя!
Здесь другое решение, которое я нахожу менее взломанным, чем подход "стиль кнопки". Он также позволяет установить расстояние (расстояние) между изображением и текстом.
class ImageLabel : Label
{
public ImageLabel()
{
ImageAlign = ContentAlignment.MiddleLeft;
}
private Image _image;
public new Image Image
{
get { return _image; }
set
{
const int spacing = 4;
if (_image != null)
Padding = new Padding(Padding.Left - spacing - _image.Width, Padding.Top, Padding.Right, Padding.Bottom);
if (value != null)
Padding = new Padding(Padding.Left + spacing + value.Width, Padding.Top, Padding.Right, Padding.Bottom);
_image = value;
}
}
protected override void OnPaint(PaintEventArgs e)
{
if (Image != null)
{
Rectangle r = CalcImageRenderBounds(Image, ClientRectangle, ImageAlign);
e.Graphics.DrawImage(Image, r);
}
base.OnPaint(e); // Paint text
}
}
Один из альтернатив UserControl
- использовать TableLayoutPanel
с двумя столбцами и одной строкой, помещая элемент управления изображением в одну ячейку и текстовое управление в другое.
Его старый вопрос, но, возможно, кто-то будет выглядеть здесь, как будто я здесь...
Вы можете использовать выравнивание по изображению и по тексту:
label.TextAlign = ContentAlignment.MiddleRight;
label.ImageAlign = ContentAlignment.MiddleLeft;
nameoftextlabel.hidden=1
Это должно сработать.