2009-09-23 70 views

回答

36
Style s = new Style(); 
s.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed)); 
tabControl.ItemContainerStyle = s; 
7

那麼,有幾種方法可以做到這一點。

最醜陋的方法:使用VisualTreeHelper查找TabPanel(或任何其他用於託管物品的面板),並將它的Visibility屬性設置爲Visibility.Collapsed。爲什麼醜陋?在這裏創建一些煩人的錯誤很容易,或者如果你不夠細心,打破這種方法'無害'風格更新...

我更喜歡使用Xaml和代碼的組合。您綁定TabItem的可見性以查看模型屬性或TabPanel的可見性以查看模型屬性。在這兩種情況下,您都必須重寫樣式(ItemContainer的樣式或整個TabControl的樣式)。在這兩種情況下,您都有查看模型。現在,要切換選項卡標題的可見性,只需更新視圖模型中的屬性即可。這裏是一個的TabItems例如:

XAML

<Window x:Class="WpfApplication5.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication5" 
     Title="Tab Settings" 
     Height="300" 
     Width="300"> 
    <Window.Resources> 
    <local:TabControlViewModel x:Key="tabVM" /> 
    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" /> 
    </Window.Resources> 
    <Grid> 
    <TabControl DataContext="{StaticResource tabVM}"> 
     <TabControl.ItemContainerStyle> 
     <Style TargetType="{x:Type TabItem}"> 
      <Setter Property="Visibility" 
        Value="{Binding TabHeaderVisible, Converter={StaticResource booleanToVisibilityConverter}}" /> 
     </Style> 
     </TabControl.ItemContainerStyle> 
     <TabItem Header="Tab 1"> 
     <StackPanel> 
      <TextBlock Text="Content" /> 
      <Button Content="Toggle Header" 
        Click="ToggleHeaderClick" /> 
     </StackPanel> 
     </TabItem> 
     <TabItem Header="Tab 2 Header"> 
     <TextBlock Text="Tab 2 Content" /> 
     </TabItem> 
    </TabControl> 
    </Grid> 
</Window> 

C#

using System.ComponentModel; 
using System.Windows; 
using System.Windows.Input; 

namespace WpfApplication5 
{ 
    public partial class Window1 : Window 
    { 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void ToggleHeaderClick(object sender, RoutedEventArgs e) 
    { 
     var tabControlVM = 
     ((FrameworkElement)sender).DataContext as TabControlViewModel; 
     if (tabControlVM != null) 
     { 
     tabControlVM.TabHeaderVisible = !tabControlVM.TabHeaderVisible; 
     } 
    } 
    } 

    public class TabControlViewModel : INotifyPropertyChanged 
    { 
    private bool _tabHeaderVisible = true; 

    public ICommand ToggleHeader 
    { 
     get; private set; 
    } 

    public bool TabHeaderVisible 
    { 
     get { return _tabHeaderVisible; } 
     set 
     { 
     _tabHeaderVisible = value; 
     OnPropertyChanged("TabHeaderVisible"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string name) 
    { 
     var changed = PropertyChanged; 
     if (changed != null) 
     { 
     changed(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
    } 
} 
+6

哇。我期待像'tab.Header.Visible = false'這樣的行不會導致怪物背後的巨大XML +代碼! – 2009-09-23 16:37:54

+2

這顯示了在MVVM設計模式中完成此操作的適當方法。雖然這不是問題的要求,但對於那些在整個代碼中強制執行模式的人來說仍然有幫助。 – Charlie 2013-08-27 20:21:56

+0

如果你是strutscly MVVM很有用,但是在一些必須使用數據庫生成的東西(如POS)的項目中,這是不現實的,特別是因爲沒有XAML。然而,像這樣的項目的任何提示,以保持代碼更清潔? – ThrowingDwarf 2016-05-09 08:45:30

63

其實,這是非常簡單的隱藏選項卡條。您只需將每個TabItemVisibility設置爲Collapsed即可。您仍然可以看到標籤內容,......只是不是標籤標題本身。

+4

這對我的項目非常有用。 – jlafay 2011-01-19 16:43:32

+7

我也是,你知道它爲什麼有這種行爲嗎?我們期待標籤容器完全消失。 – Purplegoldfish 2013-03-12 15:25:58

+0

這也適用於我 - 謝謝。我還最終創建了一個BooleanToVisibilityCollapsedConverter,以便將此屬性數據綁定到我的視圖模型。 – 2013-07-21 22:09:42

0

C#

private void TabItemControl_MouseEnter(object sender, MouseEventArgs e) { if (this.TabItemControl.IsSelected == false) { this.TabItemControl.Opacity = 100; }} 

private void TabItemControl_MouseLeave(object sender, MouseEventArgs e) { if (this.TabItemControl.IsSelected == false) { this.TabItemControl.Opacity = 0; }} 

private void TabAllControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (this.TabItemControl.IsSelected == false) { this.TabItemControl.Opacity = 0; }} 
+0

請給出一些背景,爲什麼這是答案 – JonE 2015-04-14 08:14:18

0

簡單XAML風格

<TabControl> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="{x:Type TabItem}"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
     </Style> 
    </TabControl.ItemContainerStyle> 
    ... 
</TabControl> 
0

我在一些代碼,我手動填充選項卡項目嘗試這樣做...

tabItemToAdd.Visibility = Visibility.Collapsed; 

。但是當我第二次清除標籤時,我發生了一件奇怪的事情控件的項目,再次創建選項卡項目並使用此方法,然後將其添加到選項卡控件,整個選項卡項目及其內容都消失了,而不僅僅是選項卡標題。所以,我已經受夠了的this solution的方案相當於成功:

tabItemToAdd.Template = new ControlTemplate();