2012-02-02 97 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