2012-02-02 161 views
0

我是用C#WPF編寫的應用程序的「設計」接口。如何以編程方式切換使用視圖切換?

爲了便於維護和理解,我將每個標籤內容包裝在不同的XAML file中。所以在我的項目中,我得到了一個名爲「視圖」的文件夾,其中包含3個XAML文件,代表每個文件中應用程序的一個選項卡。

我希望能夠在這些選項卡之間導航,只要一個按鈕被按到某個選項卡中。

e.g : I am at Tab one called, Configuration. (the other two tabs are hidden). As soon as i hit a "start" button i want my Actual tab to be hidden,and the second tab to be shown in its place.

的問題是,我有保存的標籤就這樣一個主窗口:

<DockPanel LastChildFill="True"> 
    <StatusBar Name="statusBar" DockPanel.Dock="Bottom" Height="22"> 
     <StatusBarItem x:Name="messagePanel" Content="Ready" VerticalAlignment="Center" /> 
     <StatusBarItem Grid.Column="1" Margin="5,2" HorizontalAlignment="Right" > 
      <ProgressBar x:Name="progressPanel" IsIndeterminate="False" Width="160" Height="18" Visibility="Collapsed" /> 
     </StatusBarItem> 
    </StatusBar> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="190" /> 
      <RowDefinition Height="6" /> 
      <RowDefinition Height="110*" /> 
     </Grid.RowDefinitions> 

     <views:EventsView x:Name="eventsView" Grid.Row="2" Margin="4" /> 

     <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch" Margin="0" VerticalAlignment="Stretch" ResizeBehavior="PreviousAndNext" ShowsPreview="True" ResizeDirection="Rows" /> 

     <TabControl Margin="4" Name="tabControl1"> 
      <TabItem Header="Configuration" Name="tabItemConfiguration"> 
       <views:Configuration /> 
      </TabItem> 

      <TabItem Header="Classification" Name="tabItemClassification" Visibility="Hidden"> 
       <views:Classifier/> 
      </TabItem>     
     </TabControl> 

    </Grid> 
</DockPanel> 

問: 我如何SWICH從一個標籤頁到另一個標籤頁,編程式地在一個but的「click」事件上噸?請記住,我在一個不同的XAML文件,所以我沒有訪問(至少我不知道如何獲得訪問)的另一個選項卡的參考,因爲我會在代碼背後的代碼main window

在此先感謝,和遺憾,對於長碼粘貼

編輯:

這樣做給我訪問的標籤,但我怎麼顯示標籤,而不是僅僅的小標籤的內容?

MainWindow.Instance.tabItemClassification.Visibility = Visibility.Visible; 
MainWindow.Instance.tabItemConfiguration.Visibility = Visibility.Visible; 

我想實際上顯示了第二個選項卡

回答

0

這解決了我的問題的內容。

MainWindow.Instance.tabItemClassification.Visibility = Visibility.Visible; 
     MainWindow.Instance.tabItemConfiguration.Visibility = Visibility.Hidden; 

     // Changes the view to the classification tab 
     MainWindow.Instance.tabController.SelectedIndex = 1; 

祝您有美好的一天。

1

我會強烈建議考慮了MVVM設計模式

有了這個模式,你會綁定你TabControl.ItemsSource來代表你的標籤項,並綁定SelectedItemSelectedIndex到另一個數據字段的對象的集合DataContext的。 TabItems中的每一個將爲ViewModel,並使用不同的View繪製,並更改所選項目,您將設置SelectedValue屬性。

下面是一個例子。

你的類,它是在DataContext爲您的MainView應該是這樣的:

public class MainViewModel : INotifyPropertyChanged 
{ 
    // These should be expanded into full properties with get/set methods 
    // and the set method should raise the PropertyChanged event 
    public ObservableCollection<ITabViewModel> TabViewModels { get; set; } 
    public ITabViewModel SelectedTabIndex { get; set; } 
    public ICommand ChangeTabCommand { get; set; } 

    public MainViewModel() 
    { 
     TabViewModels = new ObservableCollection<ITabViewModel>(); 
     TabViewModels.Add(new ConfigurationTabViewModel()); 
     TabViewModels.Add(new ClassificationTabViewModel()); 

     SelectedTabIndex = 0; 

     ChangeTabCommand = new RelayCommand<int>(ChangeTabIndex); 
    } 

    void ChangeTabIndex(int tabIndex) 
    { 
     if (tabIndex >= 0 && tabIndex < TabViewModels.Count) 
      SelectedTabIndex = tabIndex; 
    } 

    // Also implement INotifyPropertyChanged 
} 

在這種情況下,你的主要XAML視圖應該是這樣的:

<TabControl ItemsSource="{Binding TabViewModels}" 
      SelectedIndex="{Binding SelectedTabIndex}"> 

    <TabControl.Resources> 
     <Style TargetType="{x:Type TabItem}"> 
      <Setter Property="Header" Value="{Binding Header}" /> 
     </Style> 

     <DataTemplate DataType="{x:Type viewModels:ConfigurationTabViewModel}"> 
      <views:Configuration /> 
     </DataTemplate> 

     <DataTemplate DataType="{x:Type viewModels:ClassificationTabViewModel}"> 
      <views:Classification /> 
     </DataTemplate> 

    </TabControl.Resources> 

</TabControl> 

如果你有興趣,我在我的博客上發佈了一個simple MVVM example,其中包含有關INotifyPropertyChangeRelayCommand的更多信息,關於Navigation with MVVM的文章包含與我在此處發佈的內容非常類似的示例,儘管它將ContentContentControl而不是SelectedItemTabControl