我写了一个非常简单的UserControl
这里是Xaml代码
<UserControl x:Name="Test1" x:Class="WpfAppXtesting.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfAppXtesting"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" Loaded="Test1_Loaded">
<Grid x:Name="GridRoot" Background="Aqua">
<TextBlock x:Name="status" HorizontalAlignment="Left" Height="137" Margin="100,137,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="483" FontSize="48"/>
</Grid>
这里是
背后的代码/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
this.GridRoot.DataContext = this;
}
private void UserControl1_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "Connected":
status.Text = ((App)sender).Connected.ToString() ;
break;
}
}
private void Test1_Loaded(object sender, RoutedEventArgs e)
{
(Application.Current as App).PropertyChanged += UserControl1_PropertyChanged;
}
}
问题是,在同一项目的Window中导入此控件时设计模式会出现此错误。
NullReferenceException:未将对象引用设置为对象的实例。
如果我运行该项目,一切都很好。
如果我在Loaded方法中注释了这一行
控件在设计模式中正确显示。
任何想法? 感谢
答案 0 :(得分:2)
在设计时不要认为Application.Current
是您的申请。例如,当您使用Expression Blend
时,Current是Expression Blend。在设计时,MainWindow
不是您应用程序的主窗口。通常,导致用户/客户控制在设计时失败的操作包括以下内容:
以下是为设计时编写代码的两种方法。第一种方法是通过检查空条件来编写防御性代码。第二种方法是通过调用GetIsInDesignMode
方法检查设计模式是否处于活动状态。您可以在here了解GetIsInDesignMode
。
解决方案1:
private void Test1_Loaded(object sender, RoutedEventArgs e)
{
var app = Application.Current as App;
if( app != null)
{
app.PropertyChanged += UserControl1_PropertyChanged;
}
}
解决方案2:
private void Test1_Loaded(object sender, RoutedEventArgs e)
{
if (!DesignerProperties.GetIsInDesignMode(this))
{
// Design-mode specific functionality
(Application.Current as App).PropertyChanged += UserControl1_PropertyChanged;
}
}