WPF не загружает элемент управления - PullRequest
0 голосов
/ 27 мая 2018

Я пишу очень простой 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;
    }
}

проблемапри импорте этого элемента управления в окно в том же проекте. Режим разработки получает эту ошибку.

NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта.

, если я запускаю проект всебыло хорошо.

Если бы я прокомментировал строку в методе Loaded

, то в режиме конструктора правильно отобразился элемент управления.

Есть идеи?спасибо

1 Ответ

0 голосов
/ 27 мая 2018

Не думайте, что Application.Current - ваше приложение во время разработки.Например, когда вы используете Expression Blend, Current is Expression Blend.Во время разработки MainWindow не является основным окном вашего приложения.Обычно операции, приводящие к сбою пользовательского / обычного элемента управления во время разработки, включают в себя следующее.

  1. Приведение тока к вашему пользовательскому подклассу приложения.
  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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...