我正在为使用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;
我想实际显示第二个标签的内容
答案 0 :(得分:1)
我强烈建议您查看MVVM设计模式
使用此模式,您可以将TabControl.ItemsSource
绑定到表示选项卡项的对象集合,并将SelectedItem
或SelectedIndex
绑定到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,其中包含有关INotifyPropertyChange
和RelayCommand
的更多信息,而有关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;
祝你有个美好的一天。