Событие нажатия кнопки 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";
Другие вопросы по тегам