【问题标题】:How can I force the content load off all the TabItems of my TabControl in WPF? (using Caliburn.micro)如何在 WPF 中强制从我的 TabControl 的所有 TabItems 中加载内容? (使用 Caliburn.micro)
【发布时间】:2017-01-03 20:31:24
【问题描述】:

我使用 Caliburn.Micro 将一组屏幕加载到选项卡控件中。

我的问题是:在我单击选项卡以显示它之前,不会加载选项卡内容。我已经尝试一一更改所选索引,激活所有项目等,但没有任何效果!

有谁知道我该如何解决这个问题?我的想法和头发都用完了。谢谢!

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

【问题讨论】:

标签: wpf tabcontrol caliburn.micro caliburn


【解决方案1】:

有一件事突然出现在我身上。 ShellViewModel 不应该使用 Conductor&lt;IScreen&gt;.Collection.OneActive 基础。一次只能激活一个选项卡?您还需要将Activeitem 绑定到选项卡控件上。 ActiveItemOneActive 基类的属性。

Caliburn Micro 有一个使用标签控件here 的示例。

【讨论】:

  • 嗨@Jack Hughes!非常感谢您的回答 :) 我之前使用的是 OneActive 指挥器。我将其更改为“AllActive”只是为了进行测试。我已经尝试了您的建议,返回 OneActive 并将 ActiveItem 绑定到我的选项卡控件。不幸的是,我仍然无法强制加载所有选项卡项的内容。只有一个选项卡会触发 ViewLoaded 事件。只是为了上下文化,我需要在应用程序启动后立即加载所有选项卡中的组件,因为我必须在每个选项卡包含的网络浏览器中执行一系列自动机。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2011-02-09
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多