2016-11-10 4 views
0

私は、UserControl(WPF)を使用しているVisual C#appを作成しようとしています。 デフォルトでは、VS Community 2015 C#はメインプログラムと同じ名前空間にUserControlを生成します。それは正しく構築されています。 今後の再利用の可能性について、独自の名前空間で分けたいと思います。 別々の名前空間にUserControlを持つように自動生成コードを変更します。ここでWPFカスタムコントロールを別のネームコードで使用する

が私のコードである

の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(); 
     } 
    } 
} 

メインのWindows 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> 

Designerはエラーライン

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

プログラムコンパイル罰金が、最初のタブ(私のユーザーコントロールがあるべき場所)空白であるため、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」と表示されます。

+2

自動生成されたコードを手動で変更することは、通常はお勧めできません。 – Fang

+0

UserControl内の 'MainWindow'の' InitializeComponent'を呼び出します。これはうまくいかず、それは間違っています。そして、あなたがMainWindowを初期化する途中にあるので、 'Application.Current.MainWindow'がnullだと思います。>あなたがそれを作成している間は存在できません。これがNullRefernence Exceptionで終わる理由です。 – Mat

答えて

1

ここでは多くのことが間違っていますが、それらのすべてに答えることはできません。試してみてください ((WpfApplication1.MainWindow)Application.Current.MainWindow).InitializeComponent();

および離して

InitializeComponent();あなたのC#クラスで代わりに

+0

はい、この '((WpfApplication1.MainWindow)Application.Current.MainWindow).InitializeComponent();'が間違っていました!エラー「オブジェクト参照がオブジェクトのインスタンスに設定されていません」は、このコードに関連しています。 – Fyodor

0

はい、この((WpfApplication1.MainWindow)Application.Current.MainWindow).InitializeComponent();は間違っていました!エラー "オブジェクト参照がオブジェクトのインスタンスに設定されていません"このコードに関連しています(WPF, 'Object reference not set to an instance of an object' in DesignerのようにVSデバッガを使用して見つかりました。WPFの同様のケースでは便利です)。

コメントアウトした行(上記参照)を残して、ただInitializeComponent()のままにして、コードを2回再コンパイルすると、動作します。 また、正しいコードビハインドファイルが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だけでなく任意の名前をつけることができます)

関連する問題