2016-02-02 9 views
9

Ich erstellte ein benutzerdefiniertes TabItem mit einem DockPanel und einem Button darin.WPF benutzerdefinierte TabItem - Steuerelemente in Visual Studio Designer nicht angezeigt

XAML:

<TabItem 
     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" 
     mc:Ignorable="d" x:Class="MovieDB.UI.UserControlls.SearchTab" d:DesignWidth="500.038" d:DesignHeight="309.055"> 

    <DockPanel Background="#FFE5E5E5"> 
     <Button x:Name="button" Content="Button" Height="100" Width="75" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
    </DockPanel> 
</TabItem> 

C#:

namespace MovieDB.UI.UserControlls 
{ 
    /// <summary> 
    /// Interaktionslogik für SearchTab.xaml 
    /// </summary> 
    public partial class SearchTab : TabItem 
    { 
     private SearchContainer<SearchMovie> results; 

     public SearchTab() 
     { 
      InitializeComponent(); 
      this.Header = "Suche"; 
     } 

     public SearchTab(SearchContainer<SearchMovie> results):this() 
     { 
      this.updateSearch(results); 
     } 

     public void updateSearch(SearchContainer<SearchMovie> results) 
     { 
      clear(); 
      if(results.TotalResults == 0) 
      { 

      } 
      else 
      { 
       this.results = results; 
       Debug.WriteLine("Results: " + results.Results.Count()); 
      } 
     } 

     private void clear() 
     { 

     } 
    } 
} 

Wenn mein Programm starten die Taste angezeigt (Screenshot 2). Aber der Button und ich denke das Panel selbst wird im Visual Studio 2015 Designer nicht angezeigt (Screenshot 1).

Wo ist das Problem?

Screenshot Designer Screenshot running Programm

+1

Der von Ihnen angegebene Code bringt mich nicht in einen Build-Status, um Ihr Problem zu testen. Der XAML-Teil Ihres Codes erscheint mir seltsam, da TabItem Ihre Basisklasse ist. Eine Frage: Warum erstellen Sie kein Benutzersteuerelement, das Ihren Dock-Bereich und Ihre Schaltfläche mit Hintergrundsuchcode enthält, und fügen Sie stattdessen den Tablitems in Ihrem Tab-Steuerelement hinzu? –

Antwort

3

Wenn Sie das TabItem in einem TabControl setzen es funktioniert fine.I denkt, dass das Problem. Der Designer benötigt ein Navigationssteuerelement wie TabControl, Window Page usw. als root.

<TabControl x:Class="CustomControls.tab" 
      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" 
      mc:Ignorable="d" 
      d:DesignWidth="500.038" d:DesignHeight="309.055"> 
<TabItem> 
    <DockPanel Background="#FFE5E5E5"> 
     <Button x:Name="button" Content="Button" Height="100" Width="75" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
    </DockPanel> 
    </TabItem> 
</TabControl> 
+1

Das Problem ist, dass ich eine Tab-Kontrolle in meinem MainWindow habe. Und ich füge ein benutzerdefiniertes TabItem (das searchItem) programmatisch hinzu, wenn jemand das Suchfeld eingibt. Es ist also keine Option, es in TapControl zu setzen, da ich ein Objekt zu einem bestehenden Steuerelement hinzufüge. – Daniel

+0

Es war nur eine Erklärung, warum es nicht in Designer angezeigt wird. Aber Sie sagten, wenn Sie Ihre App starten, funktioniert es.Ist es wichtig für Sie, es im Designer zu sehen? Hier ist ein ähnlicher Thread: [link] (http://stackoverflow.com/questions/20422006/xaml-designer-doesnt-show-content-of-a-usercontrol) – Johannes

+1

Es ist bequemer, wenn ich den Designer verwenden kann. Im Moment ändere ich den TapItem-Tag in Page-Tag und bearbeite ihn im Designer. Danach ändere ich es zurück in TapItem, um die App zu erstellen. Es ist ein Workaround, aber es ist jedes Mal ein bisschen nervig. – Daniel

1

Was Sie getan haben, sollte funktionieren. Aber es tut nicht, und ich werde später versuchen, warum zu zeigen.

Aber zuerst, mein Problem zu umgehen:

  • offen Designer, und rechtsklicken Sie darauf
  • wählen: bearbeiten Zusätzliche Vorlagen, dann Inhalt bearbeiten generiert, dann Leer erstellen .. . Ihren neuen DataTemplate einen Namen geben, sagen 'DataTemplate1'
eine leere DataTemplate mit einem Schlüssel DataTemplate1, und es wird Ihr fügen Sie das ContentTemplate Attribut TabItem, mit DataTemplate1 ihm zugeordneten (von DynamicResource) -

Designer wird einige Code generieren.

Verschieben Sie jetzt den Inhalt Ihrer TabItem an die DataTemplate1. Der Designer sollte Ihr Layout korrekt anzeigen.

Wenn Sie das Steuerelement SearchTab schließen und erneut öffnen, werden Sie feststellen, dass Sie den Inhalt nicht mehr sehen können. Um es zurück zu haben, klicken Sie mit der rechten Maustaste auf den Designer, wählen Sie Bearbeiten Sie weitere Vorlage, dann Bearbeiten Sie generierten Inhalt, dann Edit Current.

Warum konnte der Designer Ihre SearchTab nicht laden? Wenn Sie mit der rechten Maustaste auf den Designer klicken und Vorlage bearbeiten, dann Bearbeiten Sie eine Kopie ... Sie haben TabItem Stil generiert. Der Header des TabItem wird vom ContentPresenter angezeigt, während der Inhalt des TabItems innerhalb des InnerBorderBorder angezeigt werden muss.Dieser Rahmen hat Opacity auf Null gesetzt und wird von MultiTriggers auf 1 geändert, die von TabControl abhängig sind. Die TabControl in Ihrem Fall existiert nicht, also sind alle Bindungen kaputt. Was bedeutet, dass das Ändern eines Standards Style für 'TabItem', auch Ihr Problem lösen würde.

+0

Ich denke, das ist wirklich eine große Antwort, die einige Einblicke gibt. Übrigens funktioniert es! Was meinst du mit "Style für TabItem ändern"? Ist es möglich, einen Stil mit Opazität zu erstellen? = Null oder so? Und ist es möglich, das DataTemplate anstelle des ContentPresenters dauerhaft anzuzeigen? – anhoppe

+0

Und wie kann ich meine View-> ViewModel Bindung wieder funktionieren lassen? – anhoppe

+0

@anhoppe. Wenn ich mich gut erinnere (ich habe diesen Code nicht bei mir), habe ich mit dem Style für TabItem gespielt, so dass ContentTemplate an Content gebunden wurde (TemplateBinding). Das hat funktioniert. Ich müsste etwas Zeit für eine tiefere Antwort darauf verwenden. Für View-> ViewModel Bindings müssen Sie DataType auf DataTemplate setzen (DataType = "{x: Type YourType}") –

1

Obwohl ich meine Dev-Maschine nicht zum arbeiten habe, kann ich nur einen Vorschlag machen. Was auch immer Sie auf Ihrem Tab-Element-Steuerelement möchten, warum nicht alle Steuerelemente in ein benutzerdefiniertes Benutzersteuerelement oder Raster mit der Prämisse, die Sie wissen, dass Sie es Tab Registerkarte hinzugefügt werden, die dynamisch auf Ihrer Registerkarte hinzugefügt wird.

Das Registerkartenelement benötigt das entsprechende übergeordnete Registerkartensteuerelement, um es im Designer zu rendern. Aber wenn Sie alles als Standardsteuerung erstellen, sollten Sie es so aussehen lassen und bedienen, wie Sie es erwarten.

Fügen Sie dann zur Laufzeit Ihr Tab-Element hinzu, fügen Sie dann das benutzerdefinierte Steuerelement zu Ihrem dynamisch hinzugefügten Tab-Element hinzu und prüfen Sie, ob das für Sie funktioniert. Sie haben scheinbar alle anderen Komponenten/Prozesse arbeiten. Selbst wenn Ihre Beispielsteuerung nur ein Etikett, eine Textbox oder etwas ähnliches war.

+0

Nachdem ich mit swiszcs antworte, kam ich endlich dazu, Ihren Vorschlag zu verwenden. Es ist einfach und effektiv. Versteh mich nicht falsch, ich schätze Swiszcz Post wirklich, da es hilft, das Problem zu verstehen, und es ist eine unkonventionelle Lösung, aber es scheint zu viele Fehler zu haben. Was mir an diesem Ansatz am besten gefällt, ist, dass die Bindung nicht unterbrochen wird, wenn ich den TabItem-Inhalt in einem designierten Benutzersteuerelement herausziehe. Es ist für den Rest des Codes vollkommen transparent. – anhoppe

Verwandte Themen