Простая страница контента с множеством кнопок. Я хочу, чтобы один обработчик событий (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" />
>
Неа! Но спасибо за ответ.
Я выполняю проектную часть на 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),*
},
Спасибо - это приблизило меня. У меня было подозрение, что мне, возможно, придется пойти с Командующим...
Итак, после нескольких десятилетий исследований я отказался от попыток обойти этот метод и вместо этого обратился к Командованию. Чего я изначально не хотел делать из-за всего лишнего кода, который мне пришлось написать.
Прежде всего я создал собственный класс кнопок вне класса 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 сто раз.
Оглядываясь назад, я думаю, что нет необходимости создавать класс модели представления, но, по крайней мере, сейчас все работает, и модель представления в любом случае полезна для других вещей.
Вы ищете Как создавать повторно используемые компоненты в .NET MAUI?