2017-01-03 2 views
1

Ich habe eine Sammlung von Bildschirmen geladen in einem Tab-Steuerelement mit Caliburn.Micro.Wie kann ich den Inhalt von allen TabItems meines TabControl in WPF erzwingen? (unter Verwendung von Caliburn.micro)

Mein Problem ist: Tab-Inhalt wird nicht geladen, bis ich auf die Registerkarte klicken, um es anzuzeigen. Ich habe bereits versucht, den ausgewählten Index einzeln zu ändern, alle Elemente und so weiter zu aktivieren, aber nichts funktioniert!

Weiß jemand wie könnte ich das lösen? Mir gehen Ideen und Haare aus. Danke!

<Controls:MetroWindow x:Class="App.Views.ShellView" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" 
        xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro" 
        xmlns:cal="http://www.caliburnproject.org" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        Dialog:DialogParticipation.Register="{Binding}" 
        BorderBrush="{DynamicResource AccentColorBrush}" 
        BorderThickness="1" 
        WindowStartupLocation="CenterScreen" 
        WindowState="Maximized" 
        mc:Ignorable="d"> 
<Grid> 
    <TabControl Name="Items" > 
    </TabControl> 
</Grid> 

public class ShellViewModel : Conductor<IScreen>.Collection.AllActive 
{ 
    protected override void OnViewLoaded(object view) 
    { 
     base.OnViewLoaded(view); 

     int x = 0; 

     for(int x = 0; x < 5; x++) 
     { 
      MyTabViewModel myTabVm = new MyTabViewModel(x.ToString()); 
      Items.Add(myTabVm); 
     } 
    } 
} 

OnViewLoaded Feuer nur, wenn ich auf der Registerkarte klicken :(

public class MyTabViewModel : Screen 
{ 
    public MyTabViewModel(string displayName) 
    { 
     this.DisplayName = displayName; 
     this.ViewAttached += SistemaClaroViewModel_ViewAttached; 
    } 

    protected override void OnViewLoaded(object view) 
    { 
     GetBrowser().Navigate(new Uri("https://www.google.com.br/")); 
     base.OnViewLoaded(view); 
    } 

    public WebBrowser GetBrowser() 
    { 
     return ((MyTabView)this.GetView()).Browser; 
    } 
} 
+0

Überprüfen Sie http://stackoverflow.com/questions/20852204/how-can-i-force-a-tabitem-to-initialize-content-on-load. Versuchen Sie, 'TabPage.Show()' Methode eins nach dem anderen – RazvanR

Antwort

0

Ich habe mein Problem gelöst, indem ich meine Ansichten auf meinem Fenster dupliziere und sie unsichtbar mache. Ich denke, es ist eine schreckliche Lösung, aber alles, was ich habe. :/ Wenn jemand hier mit neuen Vorschlägen endet, bin ich ganz Ohr.

<!-- My visible tab control--> 
<TabControl Name="Items" 
       Grid.Row="0" 
       SelectedValue="{Binding ActiveItem}" /> 

<!-- Duplicated, invisible, tab control's views (Only to force immediate loading --> 
<ListView Grid.Row="1" 
      ItemsSource="{Binding Items}" 
      Visibility="Hidden"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ContentControl cal:View.Model="{Binding}" /> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
0

Eine Sache, mich herausspringt. Sollte nicht die ShellViewModel die Conductor<IScreen>.Collection.OneActive Base werden. Es kann immer nur eine Registerkarte aktiv sein Sie müssen auch die Activeitem an die Registerkarte Steuerelement binden ActiveItem ist eine Eigenschaft der OneActive Basis c Mädel.

Caliburn Micro haben eine Probe mit einem Tab-Steuerelement here.

+0

Hi @Jack Hughes aufzurufen! Vielen Dank für Ihre Antwort :) Ich habe den OneActive Dirigent schon einmal benutzt. Ich habe es nur für einen Test in "AllActive" geändert. Ich habe Ihren Vorschlag ausprobiert, gehe zurück zu OneActive und verbinde das ActiveItem mit meinem Tab Control. Leider kann ich immer noch nicht den Inhalt aller Tab-Elemente laden. Nur eine Registerkarte löst das ViewLoaded-Ereignis aus. Nur zur Kontextualisierung muss ich die Komponenten in allen meinen Registerkarten geladen haben, sobald die Anwendung gestartet wird, weil ich eine Reihe von Automaten in Webbrowser ausführen muss, die jede Registerkarte enthält. –

Verwandte Themen