订阅事件时无法创建Usercontrol实例

时间:2018-07-10 16:21:19

标签: c# wpf visual-studio xaml

该主题还有其他主题,但是我没有发现与我的特定问题相关的任何主题。

在Visual Studio 2017中,即使似乎没有什么奇怪的情况,我也会遇到XAML设计器提示错误的情况。

基本上,要重现该问题,请考虑这两个文件,

MainWindow.xaml

<Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TabControl Background="White">
            <TabItem Header="TEST" Width="60">
                <local:UserControl1/>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

Usercontrol1.xaml.cs

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
            App.Current.MainWindow.Closing += window_Closing;
        }

        void window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {

        }
    }
}

请注意,我没有包含Usercontrol1.xaml的内容,因为此处与它们无关。它可以是一个空的UserControl。

现在,设计者会显示错误

Cannot create an instance of "Usercontrol1". 

这很奇怪,因为在启动应用程序时,一切正常。通过创建一个新的WPF应用并创建上面显示的相同模式,可以很容易地重现这一点。

注意

我尝试删除订阅

App.Current.MainWindow.Closing += window_Closing;

它消除了错误。所以,这是原因,但是为什么呢?

2 个答案:

答案 0 :(得分:1)

App.Current DesignMode 中为空。

您可以检查 IsInDesignMode 以防止运行此代码。喜欢,

public UserControl1()
{
    InitializeComponent();
    if(!DesignerProperties.GetIsInDesignMode(this))
        App.Current.MainWindow.Closing += window_Closing;
}

MSDN blog中的相关帖子。

答案 1 :(得分:0)

在设计模式下,它将尝试运行用户控件的构造函数,并且由于尚未设置主窗口,因此它将在事件订阅期间引发异常。订阅活动之前,您可以轻松地检查是否处于设计模式:

if (!DesignerProperties.GetIsInDesignMode(this))
    App.Current.MainWindow.Closing += window_Closing;