Visual Studio 2013 WPF UserControl RoutedEvent名称是否已被使用?

时间:2014-06-05 11:51:13

标签: c# wpf xaml events visual-studio-2013

我在Visual Studio 2013中有一个WPF项目,其中包含我创建的自定义控件,其中包含一个自定义事件。每当我将控件拖到我的MainWindow.xaml文件中时,它都会在设计器中显示一次。一旦我编译了我的应用程序(成功),设计师就会显示这样的内容,显示我的控件已被破坏:

enter image description here

在XAML代码中(再次,仅在第一次编译之后),我得到了这个提示:

enter image description here

但是,无论我将事件名称更改为什么(比如“EggsAndBaconEvent”),它都会在第一次编译后破坏设计器。

Visual Studio将尝试在此窗口中帮助我:

enter image description here

这是我的代码,它与创建事件有关:

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中的一些奇怪的异常?

感谢您的时间。

2 个答案:

答案 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)
    );
}

...设计模式不会中断,应用程序将继续按预期运行。

在某些情况下,我发现您可能需要包含这样的预防措施:

  • 活动报名
  • 访问app.config
  • 在初始化时使用C#更新任何控件属性

答案 1 :(得分:0)

该错误意味着它所说的内容:

  

RoutedEventExpanded已注册OwnerType Settings

这意味着您已经以某种方式复制了这行代码:

ExpandEvent = EventManager.RegisterRoutedEvent(
    "Expanded",                    /* name */
    RoutingStrategy.Bubble,        /* routingStrategy */ 
    typeof(RoutedEventHandler),    /* handlerType */
    typeof(Settings)               /* ownerType <--- Duplicated */
);

可能已将其复制并粘贴到其他控件中,但忘记将OwnerType值从Settings更新为正确的类名。如果您搜索typeof(Settings),则应该找到它。