2016-11-10 3 views
0

Ich versuche Visual C# App, die UserControl (WPF) verwendet. Standardmäßig generiert VS Community 2015 C# UserControl im selben Namespace wie das Hauptprogramm. Es ist korrekt gebaut. Ich möchte es in seinem eigenen Namespace für mögliche zukünftige Wiederverwendung trennen. Ich ändere automatisch generierten Code, um UserControl in einem separaten Namespace zu haben.WPF Custom Control in separaten Namenapce

Hier ist mein Code

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# Klasse

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

Hauptfenster 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 zeigt Fehler für Zeile „Objektverweis nicht auf eine Instanz eines Objekts festgelegt wird“

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

Programm zusammengestellt in Ordnung, aber erste Reiter (wo mein Usercontrol sein sollte) ist leer.

+2

Ändern automatisch generierten Code von Hand ist in der Regel keine gute Idee – Fang

+0

Sie rufen die 'InitializeComponent' der 'MainWindow' in der UserControl. Das kann nicht funktionieren und ist mehr als falsch. Und ich nehme an, dass 'Application.Current.MainWindow' null ist, weil Sie mitten in der Initialisierung des MainWindow sind -> es kann nicht existieren, während Sie es erstellen. Das ist der Grund, warum Sie eine NullReference Exception haben – Mat

Antwort

1

Hier sind viele Dinge falsch, kann nicht alle beantworten. Versuchen Sie, ((WpfApplication1.MainWindow) Application.Current.MainWindow) .InitializeComponent();

und verlassen

InitializeComponent();

statt in C# Klasse

+0

Ja, das '((WpfApplication1.MainWindow) Application.Current.MainWindow) .InitializeComponent();' war falsch! Fehler "Objektverweis ist nicht auf eine Instanz eines Objekts festgelegt" bezieht sich auf diesen Code. – Fyodor

0

Ja, das ((WpfApplication1.MainWindow)Application.Current.MainWindow).InitializeComponent(); war falsch! Fehler "Objektverweis ist nicht auf eine Instanz eines Objekts festgelegt" bezieht sich auf diesen Code (gefunden mit VS-Debugger wie in diesem Beitrag WPF, 'Object reference not set to an instance of an object' in Designer. Ich denke, es ist nützlich für ähnliche Fälle mit WPF).

Nach dem Auskommentieren (siehe oben) und dem Verlassen von nur InitializeComponent() und zweimaligem Kompilieren des Codes - es funktioniert! Ich habe auch überprüft, dass die richtige Code-Behind-Datei an XAML-Datei (Accidentally deleted the code behind for an Xaml file. How do I add the code behind again?) gebunden ist.

Und auch diese Zeilen sind wichtig xmlns:UserControl="clr-namespace:nsTabI2CMemRW" und <UserControl:TabI2CMemRW Margin="0,0,-0.2,278.2"/>. Ich denke, ich kann sie das erste Mal vermissen. (Nach xmlns: kann jeder Name sein, nicht nur UserControl)