Не удалось присвоить свойству «System.Windows.Controls.Primitives.ButtonBase.Click»

Возникла интересная ситуация, которую я не понимаю.

Вот сценарий:

Я создаю простое приложение Silverlight 5. Я размещаю кнопку на главной странице и создаю обработчик события Click.

XAML показан ниже.....

<UserControl x:Class="SilverlightApplication6.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    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:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="130,43,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</UserControl>

Все идет нормально.

Подключите обработчик событий в коде так....

private void button1_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Hi There!!!");
}

Скомпилируйте и запустите приложение. Я «нажимаю» кнопку и получаю красивое маленькое окно сообщения. Опять же, пока все хорошо.

Добавьте новый метод (как показано ниже) в исходный код с тем же именем метода, что и у обработчика события нажатия кнопки, но с другой подписью.

private void button1_Click()
{
    MessageBox.Show("This method causes a XamlParseException!");
}

Скомпилируйте и выполните код. Поднимите приложение и нажмите кнопку, и я получаю следующее исключение:

System.Windows.Markup.XamlParseException was unhandled by user code
  Message=Failed to assign to property 'System.Windows.Controls.Primitives.ButtonBase.Click'. [Line: 10 Position: 149]
  LineNumber=10
  LinePosition=149
  StackTrace:
       at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
       at SilverlightApplication6.MainPage.InitializeComponent()
       at SilverlightApplication6.MainPage..ctor()
       at SilverlightApplication6.App.Application_Startup(Object sender, StartupEventArgs e)
       at MS.Internal.CoreInvokeHandler.InvokeEventHandler(UInt32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
       at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName, UInt32 flags)
  InnerException: 

Почему это происходит?


person doon386    schedule 19.06.2012    source источник


Ответы (2)


Проблема в том, что void button1_Click() не является допустимым обработчиком для события Click. Click — это RoutedEventHandler, который определяется как:

public delegate void RoutedEventHandler(
    Object sender,
    RoutedEventArgs e
)

Обратите внимание, что вы также можете использовать void button1_Click(object anyName, EventArgs forTheParams), просто он должен достаточно точно соответствовать делегату, чтобы его можно было преобразовать.

person Tim S.    schedule 19.06.2012
comment
Правильно, это недопустимый обработчик, но я не пытаюсь использовать его как таковой. Само присутствие этого кода генерирует исключение. - person doon386; 19.06.2012
comment
Хм... очевидный обходной путь - переименовать один из методов. Другой возможный вариант — добавить параметры по умолчанию, равные нулю (object sender = null, EventArgs e = null), чтобы ваш код по-прежнему мог вызывать button1_Click(), и у него были только пустые параметры sender и e. Если они не работают, было бы неплохо объяснить взаимосвязь между этими двумя перегрузками. - person Tim S.; 19.06.2012
comment
Мне не нужна работа вокруг. Это легко, как вы предложили, просто переименуйте метод. Мне интересно, учитывая полиморфную природу C#/.NET/CLR, почему правильный метод не может быть разрешен/определен во время выполнения? - person doon386; 19.06.2012
comment
У меня та же проблема, но я считаю, что XamlParser использует отражение для поиска методов с именем обработчика, установленным в xaml. Если он находит более одного, генерирует исключение. - person Jone Polvora; 26.01.2013

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

<Button Click="MethodName"..../>

Я как-то продублировал метод не зная и в результате тоже получил эту ошибку. Не удалось назначить свойство System.Windows.Controls.Primitives.ButtonBase.Click Надеюсь, это поможет кому-то сэкономить время.

person Stephan    schedule 02.06.2014