#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
не изменяет поведение. Я не могу переключить позиции кнопок, они находятся в двух совершенно разных окнах. Возможно ли вообще перезаписать ClickEventClick="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
значению!
В любом случае, мои два цента стоят.