Очень люблю, когда на кнопках есть цветные иконки, позволяющие мгновенно понимать назначение (это у меня ещё со времён Delphi повелось).
Но т.к. гемороиться с картинками неохота, использую бесплатный Awesome Font (версии 5).
Соотв. кнопка состоит из TextBlock для иконки и TextBlock для текста. Самые часто нужные проперти вынул на верхний уровень.
Получился вот такой говнокодик:
Незамутнённый C# код
public class AwesomeButton : Button
{
public TextBlock txtCaption;
public TextBlock txtIcon;
public AwesomeButton ()
{
#region create Button content manually
txtCaption = new TextBlock {
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center,
};
txtIcon = new TextBlock {
Text = "\uF005",// star
FontFamily = new FontFamily("Font Awesome 5 Free Regular"),
FontSize = 16,
Padding = new Thickness(5, 2, 5, 2),
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center,
};
txtIcon.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Ideal);
var dock = new DockPanel();
DockPanel.SetDock(txtIcon, IconPos);
dock.Children.Add(txtIcon);
dock.Children.Add(txtCaption);
var grid = new Grid();// needed only to be sure 'dock' is shrinked to all avl space
grid.Children.Add(dock);
this.Content = grid;
#endregion
}
/// <summary>String of characters from 'Awesome' font</summary>public string IconText
{
get => txtIcon.Text;
set => txtIcon.Text = value;
}
Dock _iconPos = Dock.Left;
public Dock IconPos
{
get => _iconPos;
set {
_iconPos = value;
DockPanel.SetDock(txtIcon, _iconPos);
}
}
public Brush IconColor
{
get => txtIcon.Foreground;
set => txtIcon.Foreground = value;
}
public double IconSize
{
get => txtIcon.FontSize;
set => txtIcon.FontSize = value;
}
/// <summary>Text appearing on the button</summary>public string Text
{
get => txtCaption.Text;
set => txtCaption.Text = value;
}
public new bool IsEnabled
{
get => base.IsEnabled;
set {
base.IsEnabled = value;
txtIcon.Opacity = (value ? 1.0 : 0.5);// icon is not affected by IsEnabled - make disabled look manually
}
}
}
Если выставлять IconPos, можно регулировать, где иконка появится — на всех 4 сторонах света. Обратите внимание ещё на txtCaption и txtIcon — это как раз "выставленные наружу" наши текстбоксы, позволяющие в коде
регулировать то, что не видно в WPF. К слову, почему-то нельзя написать в XAML
<AwesomeButton txtCaption.FontSize="100" />
Если подскажете ПОЧЕМУ, буду очень рад. (сейчас это поля, но даже когда они были пропертями, всё равно XAML не позволял такой финт) Ну а работающий вариант такой:
Да, ещё вопрос: нужно ли к этому классу писать что-то вроде
static AwesomeButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(AwesomeButton), new FrameworkPropertyMetadata(typeof(AwesomeButton)));
}
Или WPF'у достаточно того, что класс и так напрямую унаследован он Button?
Публикую затем, что в WPF такого нет и не будет — может кому пригодится, чтобы самим не гемороиться. Ну и цель №2 — критика.
Прежде, чем вы закидаете говном мою кнопыську, сразу напишу в оправдание: я не особый спец по WPF, юзаю в осн. готовые контролы, а процесс создания кнопки с нуля — это полный мрак! (спасибо MS)
Соотв. я решил задачу максимально простым методом — тупо унаследовал класс и добавил пропертей. Это я к тому, что этот путь тоже оправдан — люди, которые не особо углублялись в WPF, вполне смогут улучшать мой код.
Короче, прошу не столько возгласов "да тут шаблоны надо было на 3 километра написать!", сколько рациональных улучшений именно для моего варианта контрола. Понятно, что кое-что нахардкодил, но это невелик грех, интересны остальные аспекты.
Всем заранее спасибо!
Писать код в WPF, когда его можно не писать — неконвенционально. Изпользуй дата или если уж совсем невмогуту контрол темплейты. Свистоперделки с амбициями на "3rd party controls" никому не нужны, ты бы еще инсталлер добавил
я уже не помню деталей но TextBlock.FontSize, возможно, будет работать. Синтакс, использованный тобой, i.e. txtCaption.FontSize, говорит мне, что ты просто не понимаешь как работает маркап in conjunction with attached properties, сорян.
Здравствуйте, {куча сикарашек}, Вы писали:
尿Ǥ푙>Писать код в WPF, когда его можно не писать — неконвенционально. Изпользуй дата или если уж совсем невмогуту контрол темплейты.
Ясно. Пост напрочь проигнорирован. Ребят, вы в глаза долбитесь что ли? Или мне отдельно БОЛЬШИМИ КРАСНЫМИ БУКВАМИ писать?
тупо унаследовал класс и добавил пропертей. Это я к тому, что этот путь тоже оправдан — люди, которые не особо углублялись в WPF, вполне смогут улучшать мой код.
{куча сикарашек}, твой горящий... гм... ну вот который ниже спины предмет... он прямо вырывается как Дартаньян обвинить меня в каком-то незнании. Ты считаешь, я без тебя не понимаю, что я — чайник? ОПЯТЬ ЦИТИРУЮ:
я не особый спец по WPF
Для тех.специалиста у тебя крайне ограниченные когнитивные способности. Нельзя решать задачу, не понимая исходной постановки! Постановка такова: делается маленькая, полезная кнопка средней руки спецом (средней в WPF). И таких "средних" как я — миллионы (для кого она и делается). Вникать в глубины индусо-архитектуры я не хочу (иначе давно бы обложился книгами и курсами). WPF — далеко не та технология, куда нужно вкладывать ресурсы. Скажем так: от WPF мне нужна только декларативность и минимальные знания для решения задач. Все их шаблоны, данные-шаблоны, это всё забавно, но для космических архитекторов, КОТОРЫМ НА НЁМ НЕ ПИСАТЬ. Швырнули в толпу кусок индусячего гения и забыли!
尿Ǥ푙> Свистоперделки с амбициями на "3rd party controls" никому не нужны, ты бы еще инсталлер добавил
Видишь — в русском языке это называется узколобость. Ты смотришь на контрол как на какой-то продукт типа Word! На самом деле всё проще: в WPF есть ТЫСЯЧИ мелких вещей, которые мы нудно вынуждены повторять. Если хотя бы 6 строк можно упростить в одну — это надо делать. И я сделал. У меня таких "Awe-кнопок" практически в каждой программе! Разумеется, я даже не собираюсь создавать никаких библиотек, но иметь под рукой удобную кнопку — почему нет? В чём у тебя отторжение? Или у тебя комплекс бога WPF, который снисходительно смотрит на чужие потуги? Ну так пока ты смотришь, Я ДЕЛАЮ.
К примеру, у меня есть вспом.перделка, позволяющая писать так:
<GridEx RowsDef="@ *" ColsDef="@ @ 10 *">
Экономит по 10 строк кода на каждый такой грид. Ты можешь сколько угодно ржать, но в моём коде становится чище именно благодаря мелким улучшателям. Это ли не польза??
尿Ǥ푙> <AwesomeButton txtCaption.FontSize="100" />
尿Ǥ푙>почитай про магию аттчед свойств:
Это не аттачед свойства, ты даже не можешь понять, что именно я хочу.
Суть: я не собираюсь тащить в контрол всё, что есть в "выставленных" контролах — это глупо, да к тому же их ещё и два одинаковых. Мне нужен способ ЧЕРЕЗ ИМЯ контрола выставлять свойства, но в parent-контроле. Любые свойства, которые захочет будущий юзер.
尿Ǥ푙>я уже не помню деталей но TextBlock.FontSize, возможно, будет работать. Синтакс, использованный тобой, i.e. txtCaption.FontSize, говорит мне, что ты просто не понимаешь как работает маркап in conjunction with attached properties, сорян.
Кто тебе сказал, что я вообще хочу attached свойства?? Я хочу плюшки за счёт декларативной технологии. Видишь — знания у тебя есть, а глубокого мышления — нет. Грустно.
Я так понял, что WPF в принципе не способен на такой финт, ибо убог унутре и всё движется к тому, что мы ОПЯТЬ не имеем нормальной GUI-технологии!
Здравствуйте, Baiker, Вы писали:
B>Очень люблю, когда на кнопках есть цветные иконки, позволяющие мгновенно понимать назначение (это у меня ещё со времён Delphi повелось). B>Но т.к. гемороиться с картинками неохота, использую бесплатный Awesome Font (версии 5).
опиши простым языком, что ты хочешь? ты хочешь перенести свой Delphi/VB6 опыт на WPF зачем то параллельно оскорбляя индусов — это не работает. ты говоришь о декларативном подходе и выставляешь выравнивания в коде а не маркапе ну и так далее.
ты пытаешься взять серьезную технологию на хапок вместо того чтобы понять как все работает. WPF использует композицию и не использует наследование для кастомизации, в твоем примере:
<GridEx RowsDef="@ *" ColsDef="@ @ 10 *"> а должно быть: <Grid GridEx.RowDef="" GridEx.ColsDef="">
ты реализуешь вещи неконвенционном способом, возможно твои костыли и будут работать, но ребята вдумчиво относящися к технологиям с которыми они работают тебе спасибо не скажут.
П.С. Завязывай с эпитетами, относящимеся к человеку а не к его знаниям.
Здравствуйте, Marty, Вы писали:
B>>Awesome Font
M>Шрифт таки надо в систему устанавливать?
Разумеется. Сам шрифт постоянно улучшается (есть даже версия 6), так что нет смысла его куда-то внедрять.
Я наверное недообъяснил, что кнопка — это не какая-то там супербиблиотека типа ДевЭкспрессов Это просто маленькая помощь для ежедневной рутины. Вот как тот пример с гридом.
Здравствуйте, 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ, Вы писали:
尿Ǥ푙>опиши простым языком, что ты хочешь?
От тебя — ничего. Ты погряз в собственной заумности, что даже перестал слышать людей. Не выижу смысла с твоей стороны здесь умничать, найди более рациональное применение своему пафосу.
Не расстраивайся ты так. Люди тебе дело говорят, намекают — что твои школьные поделки со шрифтами трeбующими установки и агрессивно неконвенциональным подходом могут вылиться (а скорее всего так и было) в боль для людей, испольующих их. Все окей, пиши.
Здравствуйте, Baiker, Вы писали:
B>Очень люблю, когда на кнопках есть цветные иконки, позволяющие мгновенно понимать назначение (это у меня ещё со времён Delphi повелось). B>Но т.к. гемороиться с картинками неохота, использую бесплатный Awesome Font (версии 5). B>Соотв. кнопка состоит из TextBlock для иконки и TextBlock для текста. Самые часто нужные проперти вынул на верхний уровень.
Кнопка WPF — это просто контейнер. Контентом может быть всё что угодно (даже другие кнопки). Всё что нужно сделать — описать этот контент в XAML.
B>К слову, почему-то нельзя написать в XAML B>
B>Если подскажете ПОЧЕМУ, буду очень рад. (сейчас это поля, но даже когда они были пропертями, всё равно XAML не позволял такой финт) Ну а работающий вариант такой:
B>Публикую затем, что в WPF такого нет и не будет — может кому пригодится, чтобы самим не гемороиться. Ну и цель №2 — критика.
Чуть выше уже есть "замечательная" реакция на вполне здравую критику. С которой я в целом согласен (на всякий случай — посмотрите мой ник, чтобы не было ощущения предвзятости суждений, я с VCL ещё с самой первой версии).
B>Прежде, чем вы закидаете говном мою кнопыську, сразу напишу в оправдание: я не особый спец по WPF, юзаю в осн. готовые контролы, а процесс создания кнопки с нуля — это полный мрак! (спасибо MS) B>Соотв. я решил задачу максимально простым методом — тупо унаследовал класс и добавил пропертей. Это я к тому, что этот путь тоже оправдан — люди, которые не особо углублялись в WPF, вполне смогут улучшать мой код.
Вы пытаетесь приделать педали с редуктором к мотору автомобиля, "потому что большой опыт езды на велосипеде". Это тупик, WPF организован несколько иначе чем VCL. Организован, к слову, тем же человеком, что когда-то создал Delphi. Вряд ли тут виноваты "те самые из MS", которые выкрутили руки талантливому человеку? (скорее, его пребывание в Borland под конец было со связаными руками, "ничего не трогай").
B>Короче, прошу не столько возгласов "да тут шаблоны надо было на 3 километра написать!", сколько рациональных улучшений именно для моего варианта контрола.
Рациональные улучшения — три варианта выше.
Про XAML-стили: сначала может показаться что их 3 километра, но это от неопытности. С ростом проекта вдруг оказывается, что нормально организованная система наследования стилей (не классов, а именно стилей) вдруг позволяет добиваться нужного двумя-тремя строчками. Строчками XAML, а не программного кода.
Итого: давайте будем учить технологию, а не пытаться сделать из неё свой привычный, но устаревший фортран.
Здравствуйте, Baiker, Вы писали:
B>>>Awesome Font
M>>Шрифт таки надо в систему устанавливать?
B>Разумеется. Сам шрифт постоянно улучшается (есть даже версия 6), так что нет смысла его куда-то внедрять.
Кстати, я выяснил, шрифты не обязательно устанавливать, есть возможность подгрузить с диска и сделать доступными для отдельного приложения на время его работы
Здравствуйте, 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ, Вы писали:
尿Ǥ푙>Не расстраивайся ты так. Люди тебе дело говорят, намекают — что твои школьные поделки со шрифтами трeбующими установки и агрессивно неконвенциональным подходом могут вылиться (а скорее всего так и было) в боль для людей, испольующих их. Все окей, пиши.