是否有一種簡單的方法來設置WPF TabControl中所有非活動選項卡的背景畫筆?我想在TabControl上模擬VS 2010的外觀 - 控件的非活動標籤的背景顏色應該與TabControl所在的窗口的背景顏色相匹配,以便您只能看到標籤的文本,而不能標籤本身。設置WPF TabControl非活動選項卡的背景顏色
我知道它需要一個ControlTemplate才能完成;我試圖找出要放在控件模板中的內容。換句話說,如何指定一個特定的畫刷應該應用於所有非活動選項卡?謝謝你的幫助。
是否有一種簡單的方法來設置WPF TabControl中所有非活動選項卡的背景畫筆?我想在TabControl上模擬VS 2010的外觀 - 控件的非活動標籤的背景顏色應該與TabControl所在的窗口的背景顏色相匹配,以便您只能看到標籤的文本,而不能標籤本身。設置WPF TabControl非活動選項卡的背景顏色
我知道它需要一個ControlTemplate才能完成;我試圖找出要放在控件模板中的內容。換句話說,如何指定一個特定的畫刷應該應用於所有非活動選項卡?謝謝你的幫助。
是的。定義畫筆,然後根據你的風格選擇標籤,觸發它的活動狀態,當它處於活動狀態時,將它設置爲一個畫筆,並在觸發器因非活動狀態而觸發時將其設置爲另一個畫筆。
這可以完全在XAML中完成。
以下是解決方案:正如Stephen所說,向控制模板添加一個觸發器。它實際上是一個屬性觸發器,它只需要設置爲非活動狀態。所以我們設置觸發器爲IsSelected = false。我們將目標TabItem
的邊框(默認控制模板中的Bd
)設置爲TabItem
,並將其Background
設置爲我們想要的顏色(我使用RelativeSource FindAncestor
來匹配標籤所在的網格)。然後我們設置Bd
的BorderThickness
爲0,我們就大功告成了:
<Trigger Property="IsSelected" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}"/>
<Setter Property="BorderThickness" TargetName="Bd" Value="0" />
</Trigger>
我把扳機的默認模板,略低於IsSelected =真觸發。
請注意,該觸發器是硬編碼的,以搜索Grid
祖先作爲非活動選項卡背景顏色的來源(AncestorType={x:Type Grid}
)。這是因爲我將我的視圖背景設置爲我用作佈局根的Grid
。如果您使用不同的佈局根控件,或者在別處設置了視圖背景顏色(例如在<Window>
標記中),則需要更改AncestorType
。
順便說一句,你還可以使用IsSelected =真觸發到活動標籤頭的Background
改變從白色,以匹配TabControl
背景色:
<Trigger Property="IsSelected" Value="true">
<Setter Property="Panel.ZIndex" Value="1"/>
<Setter Property="Background" TargetName="Bd" Value="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}}"/>
</Trigger>
對於那些誰喜歡這樣的視覺表現,這裏是完整的控制模板。它將自動應用於其範圍內的任何TabControl
。只需將此標記添加到XAML窗口的某個部分(或從ResourceDictionary
導入它),並且您的TabControl
將獲得VS 2010外觀。請記住更改FindAncestor
proeprty,以便模板將找到正確的背景顏色。
<!-- Styles for FS TabItem Control Template-->
<Style x:Key="TabItemFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1" Margin="3,3,3,1" SnapsToDevicePixels="true"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<SolidColorBrush x:Key="TabControlNormalBorderBrush" Color="#8C8E94"/>
<LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#F3F3F3" Offset="0"/>
<GradientStop Color="#EBEBEB" Offset="0.5"/>
<GradientStop Color="#DDDDDD" Offset="0.5"/>
<GradientStop Color="#CDCDCD" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="TabItemHotBackground" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#EAF6FD" Offset="0.15"/>
<GradientStop Color="#D9F0FC" Offset=".5"/>
<GradientStop Color="#BEE6FD" Offset=".5"/>
<GradientStop Color="#A7D9F5" Offset="1"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="TabItemSelectedBackground" Color="#F9F9F9"/>
<SolidColorBrush x:Key="TabItemHotBorderBrush" Color="#3C7FB1"/>
<SolidColorBrush x:Key="TabItemDisabledBackground" Color="#F4F4F4"/>
<SolidColorBrush x:Key="TabItemDisabledBorderBrush" Color="#FFC9C7BA"/>
<!-- FS TabItem Control Template-->
<Style TargetType="{x:Type TabItem}">
<Setter Property="FocusVisualStyle" Value="{StaticResource TabItemFocusVisual}"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Padding" Value="6,1,6,1"/>
<Setter Property="BorderBrush" Value="{StaticResource TabControlNormalBorderBrush}"/>
<Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid SnapsToDevicePixels="true">
<Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" Padding="{TemplateBinding Padding}">
<ContentPresenter x:Name="Content" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header" RecognizesAccessKey="True"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" TargetName="Bd" Value="{StaticResource TabItemHotBackground}"/>
</Trigger>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Panel.ZIndex" Value="1"/>
<Setter Property="Background" TargetName="Bd" Value="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}}"/>
</Trigger>
<Trigger Property="IsSelected" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{Binding Path=Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}"/>
<Setter Property="BorderThickness" TargetName="Bd" Value="0" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="false"/>
<Condition Property="IsMouseOver" Value="true"/>
</MultiTrigger.Conditions>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource TabItemHotBorderBrush}"/>
</MultiTrigger>
<Trigger Property="TabStripPlacement" Value="Bottom">
<Setter Property="BorderThickness" TargetName="Bd" Value="1,0,1,1"/>
</Trigger>
<Trigger Property="TabStripPlacement" Value="Left">
<Setter Property="BorderThickness" TargetName="Bd" Value="1,1,0,1"/>
</Trigger>
<Trigger Property="TabStripPlacement" Value="Right">
<Setter Property="BorderThickness" TargetName="Bd" Value="0,1,1,1"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="TabStripPlacement" Value="Top"/>
</MultiTrigger.Conditions>
<Setter Property="Margin" Value="-2,-2,-2,-1"/>
<Setter Property="Margin" TargetName="Content" Value="0,0,0,1"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="TabStripPlacement" Value="Bottom"/>
</MultiTrigger.Conditions>
<Setter Property="Margin" Value="-2,-1,-2,-2"/>
<Setter Property="Margin" TargetName="Content" Value="0,1,0,0"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="TabStripPlacement" Value="Left"/>
</MultiTrigger.Conditions>
<Setter Property="Margin" Value="-2,-2,-1,-2"/>
<Setter Property="Margin" TargetName="Content" Value="0,0,1,0"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="TabStripPlacement" Value="Right"/>
</MultiTrigger.Conditions>
<Setter Property="Margin" Value="-1,-2,-2,-2"/>
<Setter Property="Margin" TargetName="Content" Value="1,0,0,0"/>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{StaticResource TabItemDisabledBackground}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource TabItemDisabledBorderBrush}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
謝謝 - 我對下面的答案進行了擴展,但是您會得到正確方向的選中標記。 –