vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: XAML: Custom TabItem Template 
Autor: Maas
Datum: 24.05.09 13:02

Hallo,

Ich habe jetzt doch noch ein paar Probleme.
Zuerst einmal muss ich sagen, dass ich doch nicht den Code von Drapondur genommen habe. Ich habe die Templateauswahl über zwei erweiterte DataTemplateSelector-Klassen(Header + Content) geregelt. Das läuft auch sehr gut, solange die Templates schon vor dem Kompilieren im UC als Resource vorliegen. Dann ist auch der Typ bekannt und das macht vieles einfacher.
Ich habe jetzt eine Methode eingebaut, womit man "von außen" Templates in Verbindung mit einem bestimmten Typ hinzufügen kann. Dabei treten zwei Probleme auf:

1) Ich bekomme es hin ein Template zu übergeben, aber nicht einen AddHandler auf einen Button in diesem Template anzuwenden.

Die Methode im UC:
        Public Sub AddTemplates(ByVal header As DataTemplate, ByVal content As _
          DataTemplate, ByVal newInstanceContent As DataTemplate, ByVal type As _
          Type, ByVal btnNewInstanceName As String, ByVal btnDeleteInstanceName _
          As String)
            'TemplateKeys erstellen
            Dim headerTemplateKey As Object = type.Name & "HeaderTemplate"
            Dim contentTemplateKey As Object = type.Name & "ContentTemplate"
            Dim newInstanceContentTemplateKey As Object = "New" & type.Name & _
              "ContentTemplate"
 
            'Type registrieren
            AddSupportedType(type)
 
            'Resourcen hinzufügen
            Me.Resources.Add(headerTemplateKey, header)
            Me.Resources.Add(contentTemplateKey, content)
            Me.Resources.Add(newInstanceContentTemplateKey, newInstanceContent)
 
            'AddHandler für Add- und DeleteButton in den Templates
            AddHandler TryCast(TryCast(Me.Resources.Item( _
              newInstanceContentTemplateKey.ToString), DataTemplate).FindName( _
              btnNewInstanceName, Me), Button).Click, AddressOf _
              btnCreateNewInstanceGrid_Click
            AddHandler TryCast(TryCast(Me.Resources.Item( _
            headerTemplateKey.ToString), DataTemplate).FindName( _
            btnDeleteInstanceName, Me), Button).Click, AddressOf _
            DeleteButton_Click
 
        End Sub
Der Aufruf in der Application:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
      System.Windows.RoutedEventArgs) Handles Button1.Click
        With TabControl1
            Dim header, content, newInstanceContent As DataTemplate
            Dim headerKey As Object = "StringHeaderTemplate"
            header = CType(Me.FindResource(headerKey), DataTemplate)
            Dim contentKey As Object = "StringContentTemplate"
            content = CType(Me.FindResource(contentKey), DataTemplate)
            Dim newInstanceContentKey As Object = "NewStringContentTemplate"
            newInstanceContent = CType(Me.FindResource(newInstanceContentKey), _
              DataTemplate)
 
            .AddTemplates(header, content, newInstanceContent, GetType(String), _
              "btnCreateNewString", "btnDeleteString")
 
            .Source = New String(3) {"Test1", "Test2", "Test3", "Test4"}
        End With
    End Sub
header = ein Label, ein Button
content = ein Label
newInstanceContent = eine Textbox, ein Button

AddSupportedType = übergibt den Type für die Templates an beide DataTemplateSelector

Wie kann ich nun die Buttons finden?


2) Die Sache mit dem Type ist das zweite Problem. Ich habe bisher als Source eine "BindingList(Of Object)"(intern) bzw. eine "IEnumerable(Of Object)"(extern, Property). Ich musste intern die BindingList benutzen, weil sich sonst die TabItems nicht automatisch aktualisiert haben. Außerdem hat jeder TemplateSelector eine List(Of Type), wo alle unterstützten Types aufgelistet sind. Wird dem TemplateSelector dann ein Item übergeben überprüft er, ob sich der Type des Items in der Liste befindet. Wenn das der Fall ist, lädt er das passende Template mit Hilfe einer String-Kombination. Z.B. ist der TemplateKey für den Content für ein String-Objekt "StringContentTemplate", welcher bei "AddTemplates" auch nach diesem Prinzip gesetzt wurde.
Auf jeden Fall ist Object ja keine wirkliche Lösung für den Umgang mit unbekannten Typen. Aber ich habe auch noch nie wirklich mit (Of T) gearbeitet.

Vielleicht kennt jemand eine bessere Lösung.

Das Projekt

Danke im Voraus

Maas

Beitrag wurde zuletzt am 24.05.09 um 13:05:04 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
XAML: Custom TabItem Template2.473Maas20.05.09 19:44
Re: XAML: Custom TabItem Template1.867ModeratorRalf Ehlert20.05.09 21:23
Re: XAML: Custom TabItem Template2.035Maas20.05.09 21:40
Re: XAML: Custom TabItem Template1.804ModeratorRalf Ehlert20.05.09 22:11
Re: XAML: Custom TabItem Template1.727Maas21.05.09 13:17
Re: XAML: Custom TabItem Template2.097Drapondur22.05.09 05:09
Re: XAML: Custom TabItem Template1.769Maas22.05.09 10:38
Re: XAML: Custom TabItem Template1.780Maas24.05.09 13:02
Re: XAML: Custom TabItem Template1.714Maas24.05.09 14:00
Re: XAML: Custom TabItem Template1.869Maas25.05.09 14:10

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel