Получение ошибки CS1061 в EventSetter App.xaml

Я пытаюсь создать элемент по своему коду и связать для него стиль, а также связать его EventSetter, стиль работает отлично, но когда я пытаюсь запустить функцию, она не работает.

App.xaml

<Application x:Class="Learning.App"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:local="clr-namespace:Learning">
<Application.Resources>
    <Style TargetType="Label" x:Key="LabelTituloEstiloPadrao">
    <Setter Property="Background" Value="White" />
    <Setter Property="HorizontalAlignment" Value="Left" />
    <Setter Property="Margin" Value="40,20,0,0" />

<EventSetter Event="MouseLeftButtonUp" Handler="lbl_MouseLeftButtonUp"/>
<EventSetter Event="MouseRightButtonUp" Handler="lbl_MouseRightButtonUp"/>

    </Style>    
    </ResourceDictionary>
</Application.Resources>
</Application>

MainWindow.xaml.cs

public ViewConfigAgendaDin()
        {
            InitializeComponent();
            ConfigInicial();

            Label l = new Label();
            lblTeste.Style = (Style)App.Current.Resources["LabelTituloEstiloPadrao"];

            StackHorarios.Children.Add(l);
        }

        private void lbl_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show("Right");
        }

        public void lbl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show("Left");
        }

когда приложение создается, в EventSetter запускаются две ошибки

Ошибка CS1061 «Приложение» не содержит настройки для «lbl_MouseLeftButtonUp» и не может найти какой-либо метод расширения «lbl_MouseLeftButtonUp», который принимает первый аргумент типа «Приложение» (отсутствует ли директива использования или ссылка на сборку?)

Та же ошибка возникает и для правильного события, как я могу реализовать эти два метода в своем классе, где я использую это, не создавая проблем?


person Emiry Mirella    schedule 02.08.2018    source источник


Ответы (1)


Как правило, вы получаете Error CS1061, когда метод недоступен из XAML.

Наиболее распространенные случаи:

  • обработчик события не объявлен в коде программной части
  • Тег XAML x:Class не соответствует фактическому имени класса
  • имя метода не соответствует Handler установщика событий
  • неправильная подпись метода обработчика
  • используя метод private в классе base вместо protected
  • необходимость перезапуска визуальной студии в редких случаях

Глядя на код XAML, имя вашего класса Learning.App

<Application x:Class="Learning.App"

Но код, в котором объявлены обработчики событий, ViewConfigAgendaDin

public class ViewConfigAgendaDin

Вы не можете размещать обработчики событий где угодно и ожидать, что компилятор найдет их сам. Поскольку обработчик используется в App.XAML, вам нужно переместить обработчики событий в App.xaml.cs, и все будет в порядке.

Если вам нужно, чтобы они были в классе ViewConfigAgendaDin, либо определите Style в ViewConfigAgendaDin.xaml, либо вызовите метод в ViewConfigAgendaDin.xaml.cs из App.xaml.cs

Редактировать:

Например:

ViewConfigAgendaDin.xaml:

<ViewConfigAgendaDin 
    xmlns:v="clr-namespace:MY_NAMESPACE">
...
    <Label Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type v:ViewConfigAgendaDin}}}" 
           Style="{StaticResource LabelTituloEstiloPadrao}"/>
...
</ViewConfigAgendaDin>

ViewConfigAgendaDin.xaml.cs:

public void MyMethodForRightClick(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("Right");
}

Приложение.xaml.cs:

private void lbl_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
    ((sender as Label).Tag as ViewConfigAgendaDin).MyMethodForRightClick(sender, e);
}

Другой способ справиться с этой ситуацией — вообще избежать кода программной части. Вместо этого используйте привязку MVVM и Command. Вы можете легко связать любое событие с командой, используя взаимодействия.

person Bizhan    schedule 02.08.2018
comment
но, например, я объявляю свой EventSetter в своем app.xaml. Я не могу создать методы в классе, которые будут использовать этот стиль? в рассматриваемом методе lbl_MouseLeftButtonUp мне пришлось бы использовать таблицу данных, которая находится в классе ViewConfigAgendaDin, поскольку я могу использовать ее в этом классе - person Emiry Mirella; 03.08.2018
comment
нет, вы не можете создавать методы в ViewConfigAgendaDin. он должен быть в том же классе, что и xaml. но вы можете вызвать любой ViewConfigAgendaDin метод, который вы хотите, из App.xaml.cs см. мое редактирование. - person Bizhan; 03.08.2018
comment
Теперь вы понимаете, что этот метод похож на интерфейс, и я могу использовать его также в моем ViewConfigAgendaDin.xaml? private void lbl_MouseRightButtonUp (object sender, MouseButtonEventArgs e) {      // x var global     Label l = (sender) Label; x = l.Name; MessageBox.Show (x); } - person Emiry Mirella; 03.08.2018
comment
Я не понял вашего последнего комментария. вы можете вызывать любой метод из любого места. но обработчик события lbl_MouseRightButtonUp должен быть объявлен в app.xaml.cs - person Bizhan; 03.08.2018
comment
Я предположил, что вы не можете переместить Style в ViewConfigAgendaDin.xaml. поэтому вам нужно переместить обработчик событий в app.xaml.cs - person Bizhan; 03.08.2018
comment
пожалуйста, взгляните на ответ еще раз. Я сделал несколько изменений. - person Bizhan; 03.08.2018