Единый обработчик событий в коде C# для всех пользовательских кнопок/MAUI .NET8

Простая страница контента с множеством кнопок. Я хочу, чтобы один обработчик событий (OnButtonPress) расшифровывал, какая кнопка была нажата, и выполнял различные действия. Вместо того, чтобы утомительно писать Clicked = "OnButtonPress" сто раз в XAML, я подумал (поскольку я все равно определил собственный класс Button2:Button по разным причинам) определить этот обработчик событий как стандартный для класса Button2.

Есть ли способ сделать это? Я искал и использовал искусственный интеллект в течение нескольких дней и, похоже, не могу понять это, поэтому был бы признателен за указатель.

Я пробовал:

  • <Style />, но события не привязываются.
  • добавив public EventHandler Clicked = "OnButtonPress" в класс Button2, но он не может неявно преобразовать тип String в System.EventHandler.
  • помещая this.Clicked += new EventHandler(MainPage.OnButtonPress); в класс Button2, он жалуется на то, что OnButtonPress не существует в MainPage, хотя он явно существует.
  • переместив OnButtonPress в класс Button2, но затем он жалуется на то, что «не удалось найти тип или пространство имен OnButtonPress» (это типа... вот тут, чувак).
  • this.Clicked = OnButtonPress();
  • this.Clicked += OnButtonPress(object sender, EventArgs e);

Общая структура кода проста:

namespace Adam
{
  public partial class MainPage : ContentPage
  {
    public void OnButtonPress(object sender, EventArgs e)
    {
      // decoding stuff goes here
    }

    public class Button2 : Button
    {
      // lotsa properties and stuff added here

      public Button2()
      {
        // I didn't put any code in here
      }
    }
  }
}

и XAML (я опустил все сетки и прочее):

<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local = "clr-namespace:Adam"
             x:Class = "Adam.MainPage" 
             BackgroundColor = "Black">
  <local:Button2 Text = "Test" />
>

Неа! Но спасибо за ответ.

Adam Mac 19.07.2024 21:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я выполняю проектную часть на C#, но вы можете организовать ее в соответствии с кодом XAML. После определения статической функции в файле App.cs вы можете получить доступ к этой функции со всех страниц. Если у вас возникли трудности с этим, вы можете создать функцию на каждой странице, где вы используете кнопки, и написать эту функцию в разделе команд.

public partial class App : Application
{

    public static void btn1Cmd()
    {
        // Command
    }

    public App()
    {
        InitializeComponent();
    }
}
                                new Button()
                                {
                                    Text = "Kayıt Ol",
                                    BackgroundColor = Colors.Transparent,
                                    TextColor = Color.FromHex("#4A9EF7"),
                                    FontSize = 16,
                                    Padding = 1,
                                    Margin = 1,
                                    FontFamily = "dmsansMedium",
                                    *Command = new Command(App.btn1Cmd),*
                                },

Спасибо - это приблизило меня. У меня было подозрение, что мне, возможно, придется пойти с Командующим...

Adam Mac 19.07.2024 21:16
Ответ принят как подходящий

Итак, после нескольких десятилетий исследований я отказался от попыток обойти этот метод и вместо этого обратился к Командованию. Чего я изначально не хотел делать из-за всего лишнего кода, который мне пришлось написать.

Прежде всего я создал собственный класс кнопок вне класса MainPage:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }
}

public class Button2 : Button
{
    // stick variables in here
}

Затем я создал класс AdamViewModel:

public class AdamViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public ICommand ButtonCommand { private set; get; }

    public AdamViewModel()
    {
        ButtonCommand = new Command<string>(
        execute: (string arg) =>
        {
            // Button logic goes here
            RefreshCanExecutes();
        },
        canExecute: (string arg) =>
        {
            return true;
        });
    }

    void RefreshCanExecutes()
    {
        (ButtonCommand as Command).ChangeCanExecute();
    }

Далее я зашел на MainPage.xaml и добавил этот раздел:

<ContentPage.BindingContext>
    <local:AdamViewModel />
</ContentPage.BindingContext>

Затем в своей пользовательской кнопке я добавил CommandParameter = "A0" и аналогичный код к остальным моим кнопкам.

Наконец, в Styles.xaml я добавил код для оформления кнопки, а также команду:

    <Style TargetType = "{x:Type local:Button2}">
        <Setter Property = "TextColor" Value = "White" />
        <Setter Property = "BorderColor" Value = "DimGrey" />
        <Setter Property = "BorderWidth" Value = "1" />
        <Setter Property = "Margin" Value = "3,0,3,0" />
        <Setter Property = "Padding" Value = "0" />
        <Setter Property = "BackgroundColor" Value = "Black" />
        <Setter Property = "MinimumHeightRequest" Value = "1" />
        <Setter Property = "CornerRadius" Value = "4" />
        <Setter Property = "Command" Value = "{Binding ButtonCommand}" />
    </Style>

Обратите внимание на последний сеттер, который привязывает кнопку к моей логике процессора/декодера с одной кнопкой.

Что (вздох, утомленные вздохи) наконец-то привело к той функциональности, которую я пытался достичь — одной единственной функции, которая бы управляла ими всеми, а не писать так явно в XAML сто раз.

Оглядываясь назад, я думаю, что нет необходимости создавать класс модели представления, но, по крайней мере, сейчас все работает, и модель представления в любом случае полезна для других вещей.

Другие вопросы по теме

Как заполнить текстовое поле с помощью php ajax в каждой строке таблицы при изменении другого текстового поля в строке
Как обновлять модель (данных), связанную с формой, при каждом изменении данных формы?
Проблемы с обнаружением событий после использования контекстного меню в JavaFX (Linux)
Win32 API (C): окно постоянно исчезает во время выполнения после смены фокуса?
Аудиоэлемент HTML5: визуальные элементы кнопки для воспроизведения звука не обновляются при нажатии, а ждут, пока звук не начнет воспроизводиться (проблема с мобильным iOS)
Подкомпонент Vue 3 вызывает событие щелчка при отображении
Как обрабатывать щелчок мыши или наведение курсора мыши на значок ErrorProvider в WinForms
Python Turtle: обработка двух последовательных экранов для двух последовательных игровых функций, управляемых прослушивателем событий
Возможно ли (в Microsoft Access) прикрепить обработчик событий VBA к событию HTML элемента управления WebBrowser?
Ошибка события: TypeError: невозможно прочитать свойства неопределенного значения (чтение «stopPropagation»)