WPF未加载控件

时间:2018-05-27 07:04:56

标签: wpf xaml events

我写了一个非常简单的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方法中注释了这一行

控件在设计模式中正确显示。

任何想法? 感谢

1 个答案:

答案 0 :(得分:2)

在设计时不要认为Application.Current是您的申请。例如,当您使用Expression Blend时,Current是Expression Blend。在设计时,MainWindow不是您应用程序的主窗口。通常,导致用户/客户控制在设计时失败的操作包括以下内容:

  1. 将Current转换为App的自定义子类
  2. 将MainWindow转换为Window的自定义子类。
  3. 以下是为设计时编写代码的两种方法。第一种方法是通过检查空条件来编写防御性代码。第二种方法是通过调用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;
        }
    
    }