如何强制加载 WPF 中 TabControl 的所有 TabItem 的内容? (使用 Caliburn.micro)
How can I force the content load off all the TabItems of my TabControl in WPF? (using Caliburn.micro)
我使用 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;
}
}
有一件事让我印象深刻。 ShellViewModel
不应该使用 Conductor<IScreen>.Collection.OneActive
基数吗?一次只能激活一个选项卡?您还需要将 Activeitem
绑定到选项卡控件上。 ActiveItem
是 OneActive
基础 class 的 属性。
Caliburn Micro 有一个使用选项卡控件的示例 here。
我通过在 window 上复制我的观点并使它们不可见来解决了我的问题。
我认为这是一个糟糕的解决方案,但这就是我所拥有的。 :/
如果有人在这里提出任何新建议,我会洗耳恭听。
<!-- 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>
我使用 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;
}
}
有一件事让我印象深刻。 ShellViewModel
不应该使用 Conductor<IScreen>.Collection.OneActive
基数吗?一次只能激活一个选项卡?您还需要将 Activeitem
绑定到选项卡控件上。 ActiveItem
是 OneActive
基础 class 的 属性。
Caliburn Micro 有一个使用选项卡控件的示例 here。
我通过在 window 上复制我的观点并使它们不可见来解决了我的问题。 我认为这是一个糟糕的解决方案,但这就是我所拥有的。 :/ 如果有人在这里提出任何新建议,我会洗耳恭听。
<!-- 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>