Имя RoutedEvent уже используется
В WPF я создал 3 пользовательских элемента управления "Конфигурация пользователя", "Конфигурация системы" и "Конфигурация учетной записи". Все эти элементы управления имеют кнопки "Сохранить" и "Отмена". При нажатии этих кнопок они вызывают маршрутизируемое событие, объявленное и определенное в соответствующих классах. При нажатии кнопки "Сохранить" вызывается событие "ConfigurationSaved", а при отмене - событие "ConfigurationCancelled".
При возникновении этих событий контейнер, в котором размещается пользовательский элемент управления, позаботится о сохранении конфигурации.
Фрагмент кода для определения всех маршрутизируемых событий класса выглядит следующим образом:
AccountConfigurationView:
public partial class AccountConfigurationView : UserControl
{
static AccountConfigurationView()
{
ConfigurationSavedEvent = EventManager.RegisterRoutedEvent("ConfigurationSaved",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AccountConfigurationView));
ConfigurationClosedEvent = EventManager.RegisterRoutedEvent("ConfigurationClosed",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AccountConfigurationView));
}
#region ROUTED_EVENTS_RELATED
public static readonly RoutedEvent ConfigurationSavedEvent;
public static readonly RoutedEvent ConfigurationClosedEvent;
public event RoutedEventHandler ConfigurationSaved
{
add { AddHandler(ConfigurationSavedEvent, value); }
remove { RemoveHandler(ConfigurationSavedEvent, value); }
}
public event RoutedEventHandler ConfigurationClosed
{
add { AddHandler(ConfigurationClosedEvent, value); }
remove { RemoveHandler(ConfigurationClosedEvent, value); }
}
#endregion
}
SystemConfigurationView:
public partial class SystemConfigurationView : UserControl
{
static SystemConfigurationView()
{
ConfigurationSavedEvent = EventManager.RegisterRoutedEvent("ConfigurationSaved",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SystemConfigurationView));
ConfigurationClosedEvent = EventManager.RegisterRoutedEvent("ConfigurationClosed",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SystemConfigurationView));
}
#region ROUTED_EVENTS_RELATED
public static readonly RoutedEvent ConfigurationSavedEvent;
public static readonly RoutedEvent ConfigurationClosedEvent;
public event RoutedEventHandler ConfigurationSaved
{
add { AddHandler(ConfigurationSavedEvent, value); }
remove { RemoveHandler(ConfigurationSavedEvent, value); }
}
public event RoutedEventHandler ConfigurationClosed
{
add { AddHandler(ConfigurationClosedEvent, value); }
remove { RemoveHandler(ConfigurationClosedEvent, value); }
}
#endregion
}
UserConfigurationView:
public partial class UserConfigurationView : UserControl
{
static UserConfigurationView()
{
ConfigurationSavedEvent = EventManager.RegisterRoutedEvent("ConfigurationSaved",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserConfigurationView));
ConfigurationClosedEvent = EventManager.RegisterRoutedEvent("ConfigurationClosed",
RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserConfigurationView));
}
#region ROUTED_EVENTS_RELATED
public static readonly RoutedEvent ConfigurationSavedEvent;
public static readonly RoutedEvent ConfigurationClosedEvent;
public event RoutedEventHandler ConfigurationSaved
{
add { AddHandler(ConfigurationSavedEvent, value); }
remove { RemoveHandler(ConfigurationSavedEvent, value); }
}
public event RoutedEventHandler ConfigurationClosed
{
add { AddHandler(ConfigurationClosedEvent, value); }
remove { RemoveHandler(ConfigurationClosedEvent, value); }
}
#endregion
}
Когда я использую эти классы, я получаю TypeInitializationException с сообщением:
Имя Routed Event "ConfigurationSaved" для OwnerType "baskcode.Admin.Controls.AccountConfigurationView" уже используется.
Такое же исключение выдается, если я пытаюсь загрузить любой из других элементов управления. Я не могу исправить проблему. Пожалуйста, помогите мне в этом отношении.
Я использую .Net версии 4
Благодарю.
2 ответа
Я предполагаю, что вы инициализируете свой контроль более одного раза. Вы не можете зарегистрировать одно и то же имя перенаправленного события более одного раза.
Попробуйте это (для одного RoutedEvent
):
RoutedEvent[] x = EventManager.GetRoutedEventsForOwner(typeof(UserConfigurationView));
if(x == null) {
ConfigurationSavedEvent = EventManager.RegisterRoutedEvent(
"ConfigurationSaved",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(UserConfigurationView)
);
}
И это (для нескольких экземпляров): в вашем случае
using System.Linq;
...
RoutedEvent[] x = EventManager.GetRoutedEvents();
if(!x.Contains(ConfigurationSaved)) {
ConfigurationSavedEvent = EventManager.RegisterRoutedEvent(
"ConfigurationSaved",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(UserConfigurationView)
);
}
Проверьте аргументы EventManager.RegisterRoutedEvent. Если вы скопировали и вставили его из другого файла, легко забыть изменить тип владельца. Например:
public class UserControlA
{
public static readonly RoutedEvent ClickEvent =
EventManager.RegisterRoutedEvent(
"Click",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(UserControlA));
}
Но затем вы копируете и вставляете это в другой файл. Обратите внимание на ошибочный typeof(UserControlA) ниже, который должен быть typeof (UserControlB).
public class UserControlB
{
public static readonly RoutedEvent ClickEvent =
EventManager.RegisterRoutedEvent(
"Click",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(UserControlA));
}