2017-01-03 10 views
1

Caliburn.Micro를 사용하여 탭 컨트롤에로드 된 스크린 컬렉션이 있습니다.WPF에서 내 TabControl의 모든 TabItems에서 콘텐츠를 강제로로드 할 수 있습니까? (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); 
     } 
    } 
} 

내가 탭을 클릭하는 경우에만 :(

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

확인 http://stackoverflow.com/questions/20852204/how-can-i-force-a-tabitem-to-initialize-content-on-load. 'TabPage.Show()'메소드를 하나씩 호출 할 수 있습니다. – RazvanR

답변

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

것은 나를 밖으로 이동합니다. ShellViewModelConductor<IScreen>.Collection.OneActive베이스를 사용하지 않겠 불을 OnViewLoaded. 한 번에 하나의 탭만 활성화 할 수 있습니까? Activeitem도 탭 컨트롤에 바인딩해야합니다. ActiveItemOneActive 기본 c 속성입니다. 젊은 여자.

Caliburn Micro에는 탭 컨트롤 here을 사용하는 샘플이 있습니다.

+0

안녕하세요 @ 잭 휴즈! 답장을 보내 주셔서 대단히 감사합니다 :) 이전에 OneActive 지휘자를 사용하고있었습니다. 테스트 용으로 "AllActive"로 변경했습니다. 나는 OneActive로 돌아가서 ActiveItem을 내 Tab 컨트롤에 바인딩하여 제안을 시도했습니다. 불행히도 모든 탭 항목의 콘텐츠를 강제로로드 할 수는 없습니다. 하나의 탭만 ViewLoaded 이벤트를 발생시킵니다. Contextualize하기 위해 각 탭에 포함 된 웹 브라우저에 일련의 자동화를 수행해야하기 때문에 응용 프로그램이 시작되는 즉시 모든 내 탭의 구성 요소를로드해야합니다. –