Controls zur DesignTime einfügen

  • WPF
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von eichseinet.

    Controls zur DesignTime einfügen

    Hallo Leute!

    In dem Projekt befindet sich ein TabControl mit x:name = "TC". Bisher wurden die TabItems im XAML fest eingefügt.
    Jetzt hab ich das Projekt umgerüstet und alle TabItems werden erst beim Start per Code erzeugt. Es funktioniert auch alles und es lassen sich jetzt neue Tabs per Button einfügen.
    Mein Problem liegt jetzt eher im Designer; der zeigt ja nix mehr an. Wie lassen sich nun ein paar TabItems für die DesignTime einfügen?

    XML-Quellcode

    1. xmlns:local="clr-namespace:Serienliste" d:DataContext="{d:DesignInstance Type=local:MainWindow, IsDesignTimeCreatable=True}"


    In der "Sub New" im CodeBehind des MainWindow:

    VB.NET-Quellcode

    1. If DesignerProperties.GetIsInDesignMode(New DependencyObject) Then 'Abfrage, ob Designmode aktiv ist, um nur dann diese Werte zu übernehmen
    2. Dim TIE As New TabItem With {.Header = "Einstellungen"}
    3. TIE.Content = New Einstellungen_global_UC
    4. TC.Items.Add(TIE)
    5. PropertyTextblock = "Dieser Testtext wird in dem Textblock auch angezeigt"
    6. End If


    Die Tabitems werden bei Programmstart auch so zugewiesen und funktionieren. Die Designinstanz an sich klappt ja auch, weil der Text im TextBlock im Designer zu sehen ist. Ein Tab wird aber nicht dargestellt / erzeugt. Ist es überhaupt möglich Controls nur für die Designtime zu erzeugen?

    Gruß
    eddi

    eichseinet schrieb:

    Wie lassen sich nun ein paar TabItems für die DesignTime einfügen?

    Ich habe im Mainviewmodel einen CodePfad, der DummiDaten generiert, falls sich das MainViewmodel im Designmode befindet.
    TabItem entstehen bei mir durch Einsatz von DataTemplates.

    aber um sowas hinzukriegen müsstest du auf MVVM umstellen.
    Keine optimale Lösung aber Ich würde es so machen:

    XML-Quellcode

    1. <TabControl ItemsSource="{Binding TabItems}" >
    2. </TabControl>


    C#-Quellcode

    1. public partial class MainWindow : Window
    2. {
    3. public List<TabItem> TabItems { get; set; }
    4. public MainWindow()
    5. {
    6. InitializeComponent();
    7. if (DesignerProperties.GetIsInDesignMode(this))
    8. {
    9. TabItems = new List<TabItem>();
    10. TabItem tabItem1 = new TabItem() { Header = "Einstellungen1" };
    11. TabItem tabItem2 = new TabItem() { Header = "Einstellungen2" };
    12. TabItems.Add(tabItem1);
    13. TabItems.Add(tabItem2);
    14. }
    15. }
    16. }

    C#-Quellcode


    Wie sieht deine Klasse/Methode aus in der du die Tabs für die Laufzeit ertellst?
    Vielleicht kann man die sogar dafür benutzen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Amro“ ()

    @Amro: Leider fehlte die letzten beiden Tage die Zeit und dein Beitrag fiel mir erst jetzt auf. Ich habs mal auf die schnelle getestet, nur im Designmode. Das klappt prima. Wenn mir zur Laufzeit nicht irgendein Problem dazwischen kommt, dann find ich die Lösung sehr gut und brauch auch im Prgramm fast nix ändern. Die erzeugten TabItems werden einfach nur ein List(of ) statt direkt dem TabControl zugewiesen. (was eigentlich eh die feinere Art ist...)
    Ich bedanke mich schon mal und gebe Rückmeldung, wenns richtig getestet ist.
    @Amro: wenn's mal wieder etwas länger dauert... :)
    Geschrieben hatte ich es hier falsch, aber im Projekt gleich eine Observablecollection(of TabItem) verwendet. Durch den Umbau entstanden an anderen Stellen im Projekt ein paar kleine Probleme und außerdem hab ich ein bischen Zeit in das Erstellen der Designtime-Daten und Anzeigen investiert. Hier jetzt mal das Grundlegende.

    So sieht der XAML aus:

    XML-Quellcode

    1. xmlns:local="clr-namespace:Serienliste" d:DataContext="{d:DesignInstance Type=local:TabControl_Code, IsDesignTimeCreatable=True}"
    2. mc:Ignorable="d"
    3. Title="{Binding Fenstertitel}" Height="450" Width="1700"
    4. WindowState="Maximized">
    5. <Grid>
    6. <TabControl ItemsSource="{Binding TIC}" SelectedItem="{Binding Selected_TabItem}"/>
    7. </Grid>


    Und der Code für die Designtime:

    VB.NET-Quellcode

    1. Public Sub New()
    2. If DesignerProperties.GetIsInDesignMode(New DependencyObject) Then 'Abfrage, ob Designmode aktiv ist, um nur dann diese Werte zu übernehmen
    3. TIC.Add(New TabItem With {.Header = "WWDS", .Content = New Serie_UC, .DataContext = New Serie_Code})
    4. End If
    5. End Sub


    Zur Laufzeit werden die Tabs im Prinzip auch so eingefügt, nur erhalten sie dann noch ein paar mehr Daten. (Binding für den Header wird angelegt, Tooltip Header...)

    Schönen Dank nochmal für die Idee.
    Gruß
    eddi