WPF проводной обработчик событий не вызывается

#wpf #visual-studio-2008 #user-controls #.net-3.5

#wpf #visual-studio-2008 #пользовательские элементы управления #.net-3.5

Вопрос:

День 2, и я понятия не имею. [.Net 3.5, VS 2008]

У меня есть UserControl , который определяет ClickEvent :

 public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent (
  "Click", RoutingStrategy.Bubble, typeof ( RoutedEventHandler ), typeof ( TouchToggleButton ) );
  

и OnClick метод:

 protected virtual void OnClick ( )
{
    RaiseEvent ( new RoutedEventArgs { RoutedEvent = ClickEvent, Source = this } );
}
  

В каждом из двух разных окон я подключаю экземпляр этого элемента управления к обработчику событий.

 <wft:TouchToggleButton DockPanel.Dock="Top" x:Name="measurableButton" Click="measurableButton_Click">Cannot Measure</wft:TouchToggleButton>
  

и

 <wft:TouchToggleButton x:FieldModifier="public" x:Name="BuyoutButton" Click="BuyoutButton_Click">Buyout</wft:TouchToggleButton>
  

и, наконец, у меня определены два обработчика:

 private void measurableButton_Click ( object sender, RoutedEventArgs e )
{
    IsMeasurable = !IsMeasurable;
    OnMeasurableButtonChanged ( );
}
  

и

 private void BuyoutButton_Click ( object sender, RoutedEventArgs e )
{
    IsBuyout = !IsBuyout;
    OnBuyoutButtonChanged ( );
}
  

В обоих случаях, если я ставлю точку останова в OnClick , она срабатывает. В случае measurableButton RaiseEvent выполняется переход к measurableButton_Click; в случае BuyoutButton RaiseEvent НЕ переходит к BuyoutButton_Click .

В приложении нигде нет размотки (-=) BuyoutButton.Click. Что еще я мог бы проверить, чтобы выяснить причину разницы в этих поведениях?

Комментарии:

1. Единственная разница, которую я вижу в кнопках, заключается в том, что у одной есть x:FieldModifier , а у другой нет. Работает ли он, если вы его удалите? Кроме того, работает ли наоборот, если вы переключаете положения кнопок? Я не вижу ваш полный код UserControl, но возможно, что вы перезаписываете ClickEvent при настройке 2-го события, а не создаете новый экземпляр события.

2. Удаление x:FieldModifier не изменяет поведение. Я не могу переключить позиции кнопок, они находятся в двух совершенно разных окнах. Возможно ли вообще перезаписать ClickEvent Click="method" синтаксисом? (Я новичок в WPF, но разве это не все еще делегаты многоадресной рассылки?)

3. Мой UserControl является производным от другого; базовый класс определяет public event RoutedEventHandler Click . Я не понимал, что у меня должен быть точно такой же код в производном классе (почему бы ему не наследовать?), Но когда я добавил событие в производный класс, моя проблема была решена.

Ответ №1:

Благодаря Рейчел за то, что она заставила меня задуматься об этом событии, я понял, что пропустил

 public event RoutedEventHandler Click
{
    add { AddHandler ( ClickEvent, value ); }
    remove { RemoveHandler ( ClickEvent, value ); }
}
  

в моем унаследованном классе. (Будучи событием, оно не наследуется.) Это устранило мою проблему, хотя я все еще удивляюсь, как это вообще работало.

Ответ №2:

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

Просто глядя на то, что вы делаете, то есть переключаете логические значения с помощью более или менее настраиваемой реализации кнопки, я бы предложил ToggleButton вместо этого использовать a . Это был бы более WPF-ey способ сделать это.

Таким образом, состояние ясно в пользовательском интерфейсе, вам не нужно подключать логику, переключение обрабатывается за вас, и вы можете привязаться к IsChecked значению!

В любом случае, мои два цента стоят.