如何使用视图以编程方式切换切换?

时间:2012-02-02 13:31:30

标签: c# wpf user-interface tabs navigation

我正在为使用C#WPF编写的应用程序“设计”界面。

为了使维护和理解更容易,我将每个标签内容包装在不同的XAML file中。所以在我的项目中,我得到了一个名为“Views”的文件夹,它有3个XAML文件,代表每个文件中app的一个标签。

我希望能够在按钮按下某个标签后在这些标签之间导航。

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>

问题: 如何在按钮的“单击”事件上以编程方式从一个选项卡切换到另一个选项卡?请记住,我在一个不同的XAML文件,所以我没有访问(至少我不知道如何访问)另一个选项卡的引用,就像我对main window

背后的代码所做的那样

提前致谢,对于粘贴的长代码感到抱歉

修改

这样做让我可以访问标签,但是如何显示标签的内容而不仅仅是小标签?

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

我想实际显示第二个标签的内容

2 个答案:

答案 0 :(得分:1)

我强烈建议您查看MVVM设计模式

使用此模式,您可以将TabControl.ItemsSource绑定到表示选项卡项的对象集合,并将SelectedItemSelectedIndex绑定到DataContext中的另一个数据字段。 TabItems中的每一个都是ViewModel,并使用不同的View绘制,并更改您要设置SelectedValue属性的所选项目。

这是一个例子。

您的MainView的DataContext类如下所示:

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的文章包含的内容非常多与我在此处发布的内容类似的示例,虽然它在Content中替换ContentControl而不是SelectedItem中的TabControl

答案 1 :(得分: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;

祝你有个美好的一天。