Кнопки имеют свойство Tag, которое можно использовать для хранения произвольных данных о кнопке, это описано для WinForms , WPF и UWP . Простое использование, аналогичное требованию OP, продемонстрировано в этой публикации SO
Эта ситуация в практическом смысле является самой причиной того, что .Tag
вообще существует в элементах управления пользовательского интерфейса в значительной степени от рождение c#.
Таким образом, вам не нужно использовать пользовательский класс для кнопки, просто присвойте свое значение свойству .Tag
класса Button
, который вы создаете программно:
в этом примере список используется для создания кнопок и отделения создания от макета, в этом нет необходимости, но это может быть полезно. Вместо этого вы можете назначить эту кнопку его родительскому контейнеру и / или установить поля или координаты макета, вообще не сохраняя ссылку на объект Button
.
Если OP обновляет сообщение для включения примеров реализации, мы можем обновить это ответ с более точным c и полным кодом.
private List<Button> _buttons = new List<Button>();
// ... iteration or switching logic
var nextButton = new Button
{
Text = "x",
Tag = 22
};
nextButton.Click += DynamicButton_Click;
_buttons.Add(nextButton);
// ... later push the buttons into the parent container or bind to the UI
Затем обработчик нажатия кнопки, вы можете получить доступ к этому свойству тега:
это представлено из WinForms, единственная разница в UWP или WPF - это сигнатура метода, измените EventArgs
на RoutedEventArgs
private void DynamicButton_Click(object sender, EventArgs e)
{
if(int.TryParse((sender as Button).Tag?.ToString(), out int buttonValue))
{
// use buttonValue
Console.Out.WriteLine(buttonValue);
}
else
{
// Otherwise, sender was not a button, or the button did not have an integer tag value
// either way, handle that error state here...
}
}
Используя эти концепции, как только кнопки будут созданы, скажем, в некотором простом выравнивании сетки, Вы можете позволить пользователю установить это значение Tag
во время выполнения, если у вас есть поле ввода TextBox (или другое), к которому можно получить доступ из кода.
Я рекомендую использовать для этого привязки стиля MVVM, а не прямые ссылки на элемент управления TextBox, но это просто для демонстрации сути.
private void DynamicButton_Click(object sender, EventArgs e)
{
// assign the string value from the ButtonValueTextbox control to this button
string value = this.ButtonValueTextBox.Text;
if(sender is Button button)
{
button.Tag = value;
}
else
{
// Otherwise, sender was not a button
// handle the error state here if you need to...
}
}
Теперь, когда каждая кнопка имеет тег, вы можете легко добавить logi c для сохранения уникальных значений тега, перебирая другие кнопки и очищая тег, если он был ранее назначен другой кнопке.