该主题还有其他主题,但是我没有发现与我的特定问题相关的任何主题。
在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;
它消除了错误。所以,这是原因,但是为什么呢?
答案 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;