WPF无法加载控件

伤口

我写了一个非常简单的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它不是您应用程序的主窗口。通常,导致用户/客户控件在设计时失败的操作包括以下内容。

  1. 正在将Current投射到您的App的自定义子类。
  2. 将MainWindow转换为Window的自定义子类。

这是两种在设计时编写代码的方法。第一种方法是通过检查空条件来编写防御性代码。第二种方法是通过调用该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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章