我在Visual Studio 2013中有一个WPF项目,其中包含我创建的自定义控件,其中包含一个自定义事件。每当我将控件拖到我的MainWindow.xaml
文件中时,它都会在设计器中显示一次。一旦我编译了我的应用程序(成功),设计师就会显示这样的内容,显示我的控件已被破坏:
在XAML代码中(再次,仅在第一次编译之后),我得到了这个提示:
但是,无论我将事件名称更改为什么(比如“EggsAndBaconEvent”),它都会在第一次编译后破坏设计器。
Visual Studio将尝试在此窗口中帮助我:
这是我的代码,它与创建事件有关:
public partial class Settings : UserControl {
...
public static RoutedEvent ExpandEvent;
public Settings() {
...
ExpandEvent = EventManager.RegisterRoutedEvent("Expanded", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Settings));
}
...
public event RoutedEventHandler Exapnd {
add { AddHandler(ExpandEvent, value); }
remove { RemoveHandler(ExpandEvent, value); }
}
private void expanderChanged(object sender, RoutedEventArgs e) {
...
RoutedEventArgs args = new RoutedEventArgs(ExpandEvent);
RaiseEvent(args);
}
}
有谁知道为什么Visual Studio会抱怨?这是我的代码还是VS 2013中的一些奇怪的异常?
感谢您的时间。
答案 0 :(得分:1)
经过更多的研究,我发现设计模式试图执行无法正确评估的代码。要阻止设计模式执行此操作,请包装有问题的代码,如下所示:
if(!DesignerProperties.GetIsInDesignMode(this)) {
... Design Mode won't look at this ...
}
所以,在我的情况下,如果我包装事件注册,就像这样:
if(!DesignerProperties.GetIsInDesignMode(this)) {
ExpandEvent = EventManager.RegisterRoutedEvent(
"Expanded",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(Settings)
);
}
...设计模式不会中断,应用程序将继续按预期运行。
在某些情况下,我发现您可能需要包含这样的预防措施:
答案 1 :(得分:0)
该错误意味着它所说的内容:
RoutedEvent
已Expanded
已注册OwnerType
Settings
这意味着您已经以某种方式复制了这行代码:
ExpandEvent = EventManager.RegisterRoutedEvent(
"Expanded", /* name */
RoutingStrategy.Bubble, /* routingStrategy */
typeof(RoutedEventHandler), /* handlerType */
typeof(Settings) /* ownerType <--- Duplicated */
);
您可能已将其复制并粘贴到其他控件中,但忘记将OwnerType
值从Settings
更新为正确的类名。如果您搜索typeof(Settings)
,则应该找到它。