2016-11-10 3 views
0

Я пытаюсь сделать приложение Visual C#, использующее UserControl (WPF). По умолчанию VS Community 2015 C# генерирует UserControl в том же пространстве имен, что и основная программа. Он построен правильно. Я хотел бы разделить его в собственном пространстве имен для возможного повторного использования в будущем. Я изменяю автоматически сгенерированный код, чтобы иметь UserControl в отдельном пространстве имен.WPF Custom Control в отдельных namesapce

Вот мой код

UserControl

<UserControl x:Class="nsTabI2CMemRW.TabI2CMemRW" 
     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:nsTabI2CMemRW" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="500"> 

    <Grid> 
     <TextBox x:Name="AddrH"/> 
     <Label x:Name="AddrH_Label"/> 
    </Grid> 

C# класс

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using WpfApplication1; // This is my main app namespace 

namespace nsTabI2CMemRW 
{ 
    /// <summary> 
    /// Interaction logic for TabI2CMemRW.xaml 
    /// </summary> 
    public partial class TabI2CMemRW : UserControl 
    { 
     public TabI2CMemRW() 
     { 
      //InitializeComponent(); 
      ((WpfApplication1.MainWindow)Application.Current.MainWindow).InitializeComponent(); //InitializeComponent(); 
     } 
    } 
} 

Главная Окна XAML

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfApplication1" 
    xmlns:UserControl="clr-namespace:nsTabI2CMemRW" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="649.005" Width="620.667" ScrollViewer.CanContentScroll="True"> 
<Grid> 
    <TabControl x:Name="tabControl" Margin="0,0,0.4,0.2"> 
     <TabControl.BindingGroup> 
      <BindingGroup/> 
     </TabControl.BindingGroup> 
     <TabItem x:Name="I2CMemReadWrite" Header="I2C Mem Read/Write"> 

      <UserControl:TabI2CMemRW Margin="0,0,-0.2,278.2"/> 

     </TabItem> 

     <TabItem Header="TabItem"> 
     <Button x:Name="button" Content="Button" Height="100" Width="75"/> 
     </TabItem> 

    </TabControl> 

</Grid> 

Дизайнер показывает ошибку «Ссылка на объект не указывает на экземпляр объекта» для линии

<UserControl:TabI2CMemRW Margin="0,0,-0.2,278.2"/> 

Программа составлена ​​хорошо, но первая вкладка (где мой UserControl должно быть) пустым.

+2

Изменение автоматически генерируемого кода вручную обычно не является хорошей идеей – Fang

+0

, вы вызываете 'InitializeComponent'' MainWindow' внутри UserControl. Это не может работать и более чем неправильно. И я предполагаю, что 'Application.Current.MainWindow' является нулевым, потому что вы находитесь в середине инициализации MainWindow -> он не может существовать при его создании. Вот почему вы закончили исключение NullRefernence – Mat

ответ

1

Здесь много чего не так, не могу ответить на все. try comenting ((WpfApplication1.MainWindow) Application.Current.MainWindow) .InitializeComponent();

и оставляя

InitializeComponent();

вместо этого в вашем классе C#

+0

Да, это '((WpfApplication1.MainWindow) Application.Current.MainWindow) .InitializeComponent();' было неправильно! Ошибка «Ссылка на объект не установлена ​​в экземпляр объекта» относится к этому коду. – Fyodor

0

Да, это ((WpfApplication1.MainWindow)Application.Current.MainWindow).InitializeComponent(); был неправ! Ошибка «Ссылка на объект не установлена ​​в экземпляр объекта» относится к этому коду (найдена с использованием отладчика VS, как в этом сообщении WPF, 'Object reference not set to an instance of an object' in Designer.Это кажется, что это полезно для подобных случаев с WPF).

После прокомментирующей строки (см. Выше) и оставив только InitializeComponent() и дважды перекомпилировав код - он работает! Также я проверил этот файл с правильным кодом, связанный с файлом XAML (Accidentally deleted the code behind for an Xaml file. How do I add the code behind again?).

А также эти строки являются важными xmlns:UserControl="clr-namespace:nsTabI2CMemRW" и <UserControl:TabI2CMemRW Margin="0,0,-0.2,278.2"/>. Я думаю, что могу пропустить их в первый раз. (После xmlns: может быть любое имя, а не только UserControl)