我写了一个非常简单的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方法中注释了这一行
控件在设计模式下正确显示。
任何的想法?谢谢
Application.Current
在设计时不要假定这是您的应用程序。例如,当您使用时Expression Blend
,当前是Expression Blend。在设计时,MainWindow
它不是您应用程序的主窗口。通常,导致用户/客户控件在设计时失败的操作包括以下内容。
这是两种在设计时编写代码的方法。第一种方法是通过检查空条件来编写防御性代码。第二种方法是通过调用该GetIsInDesignMode
方法来检查设计模式是否处于活动状态。你可以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;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句