背景:在使用TabControl控件时,有时希望在某种情况下tabItem禁止切换,即当前的TabItem作为显示窗口使用。在一般情况下可恢复正常状态,单击可切换。TabControl没有这个属性可以控制。
摸索:在网上找了很久,在CodeProject, stackoverflow等网站上有不少的解决方法,但都比较麻烦和复杂。下面给出我自己的一个解决方法。
解决思路:TabControl控件有SelectionChanged事件,可以有SelectionChanged事件中做文章,当需要禁止切换时,可以在SelectionChanged事件中将禁止切换的页面恢复到SelectedIndex即可。通过增加一个bool变量控制是否禁止切换。
视觉森林 2014.04.10
界面XAML代码:
<Window x:Class="TabControl.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button
Content="禁止切换"
Height="39"
HorizontalAlignment="Left"
Margin="288,244,0,0"
Name="button1"
VerticalAlignment="Top"
Width="75"
Click="button1_Click"/>
<Button
Content="允许切换"
Height="38"
HorizontalAlignment="Left"
Margin="393,245,0,0"
Name="button2"
VerticalAlignment="Top"
Width="75"
Click="button2_Click"/>
<TabControl
Height="166"
HorizontalAlignment="Left"
Margin="52,60,0,0"
Name="tabControl1"
VerticalAlignment="Top"
Width="267"
SelectionChanged="tabControl1_SelectionChanged">
<TabItem
Header="tabItem1"
Name="tabItem1">
<Grid />
</TabItem>
<TabItem
Header="tabItem2"
Name="tabItem2">
<Grid />
</TabItem>
<TabItem
Header="tabItem3"
Name="tabItem3">
<Grid />
</TabItem>
</TabControl>
</Grid>
</Window>
C#代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace TabControl
{
///<summary>
/// Interaction logic for MainWindow.xaml
///</summary>
public partial class MainWindow : Window
{
privatebool IsFixTab=false;
public MainWindow()
{
InitializeComponent();
}
privatevoid tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(e.OriginalSource==tabControl1 &&IsFixTab==true)
{
e.Handled = true;
tabControl1.SelectedIndex = 1;
}
}
privatevoid button1_Click(object sender, RoutedEventArgs e)
{
tabControl1.SelectedIndex = 1; //需要手动更新至需要显示的TabItem
IsFixTab= true;
}
privatevoid button2_Click(object sender, RoutedEventArgs e)
{
IsFixTab= false;
}
}
}