Событие нажатия кнопки Avalonia не работает
У меня есть простая форма Avalonia:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="AvaloniaExperiment.MainWindow"
Title="AvaloniaExperiment">
<StackPanel>
<TextBlock>Welcome to Avalonia!</TextBlock>
<Button Name="btn" Click="btn_OnClick">Fred!</Button>
</StackPanel>
</Window>
И метод в коде позади (я хочу делать так, пока не познакомлюсь с Avalonia, тогда, возможно, я попробую MVVM):
private void btn_OnClick()
{
btn.Text = "Ginger";
}
Однако я получаю эти ошибки компиляции:
Имя btn не существует в текущем контексте (в коде позади)
Невозможно найти подходящий установщик или сумматор для свойства Щелкните тип Avalonia.Controls:Avalonia.Controls.Button для аргумента System.Private.CoreLib:System.String, доступные списки параметров установщика: System.EventHandler`1[[Avalonia.Interactivity.RoutedEventArgs, Avalonia.Interactivity, Version=0.9.0.0, Culture= нейтральный, PublicKeyToken=null]] (в XAML)
Не удалось найти подходящий установщик или сумматор для свойства Command типа Avalonia.Controls:Avalonia.Controls.Button для аргумента System.Runtime:System.String, доступные списки параметров установщика: Avalonia.UnsetValueType Avalonia.Data.IBinding System.Windows.Input.ICommand (также в XAML)
Что я мог сделать не так, подключив этот обработчик событий?
4 ответа
Отправитель - это кнопка, которую вы только что нажали, поэтому приведите тип отправителя к кнопке и установите для его свойства Content (не Text) все, что вы хотите.
public void btn_OnClick( object? sender, RoutedEventArgs args )
{
( sender as Button )!.Content = "Ginger";
}
Не нужно искать его в дереве или в чем-то еще, таким образом вы можете повторно использовать один и тот же код для всех ваших кнопок, и, например, в зависимости от того, какая это кнопка, устанавливать разные имена или стили, другие свойства и т. Д.
Более продвинутый:
public void btn_OnClick( object? sender, RoutedEventArgs args )
{
var button = ( sender as Button )!;
switch ( button.Name )
{
case "btn":
{
button.Content = "Ginger";
}
break;
case "otherBtn":
{
button.Content = "Ale";
}
break;
default:
{
button.Content = "No clue which Button you are!";
}
break;
}
}
Попытался ли ты...
public void btn_OnClick(object sender, RoutedEventArgs e)
{
btn.Text = "Ginger";
}
Вы должны добавить ControlLink в конструктор родительского контроля следующим образом:
public class AnyParentControl
{
Button btn; // for the class
public AnyParentControl() // constructor
{
InitializeComponent(); // necessary method for Avalonia
btn = this.Find<Button>("The Control Name on XAML File");
btn.Click += Cbtn_Click; // event link
}
}
Привет из Перу:D
Кнопка не имеет Text
свойство. У него естьContent
.
btn.Content = "Ginger";