如何在WPF中强制关闭内容加载我的TabControl的所有TabItem? (使用Caliburn.micro)

时间:2017-01-03 20:31:24

标签: wpf tabcontrol caliburn.micro caliburn

我使用Caliburn.Micro将一组Screens加载到制表符控件中。

我的问题是:在我点击标签显示标签内容之前,标签内容未加载。我已经尝试逐个更改所选索引,激活所有项目等但没有任何作用!

有谁知道我怎么解决这个问题?我的想法和头发都用完了。 THX!

<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 :(

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

2 个答案:

答案 0 :(得分:0)

有一件事突然袭来。我不应该ShellViewModel使用Conductor<IScreen>.Collection.OneActive基础。一次只能激活一个选项卡?您还需要将Activeitem绑定到选项卡控件上。 ActiveItemOneActive基类的属性。

Caliburn Micro有一个使用标签控件here的样本。

答案 1 :(得分:0)

我通过在窗口上复制我的视图并使它们不可见来解决了我的问题。 我认为这是一个糟糕的解决方案,但我已经拥有了。 :/ 如果有人在这里提出任何新的建议,我会全力以赴。

<!-- 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>