我正在为我的应用程序开发一个“选项卡式”GUI,使用 XAML 将 GUI 呈现给用户。
我目前正在显示几个选项卡,每个选项卡上显示应用程序的不同方面。
我有几个图标显示应用程序与远程服务器的“连接状态”(即,如果应用程序连接到服务器,则显示一个图像,如果未连接,则显示另一个图像)。这些图像当前显示在其中一个选项卡式显示中,但我想将它们移动到“选项卡”栏(在应用程序窗口的最右侧),以便它们始终可见,无论哪个选项卡用户当前正在查看。
我的 XAML 目前的结构如下:
<Grid>
<TabControl ...>
<TabItem>
...
</TabItem>
<TabItem ...>
<StackPanel>
<Grid>
...
<Image ... />
<Image ... />
</Grid>
</StackPanel>
</TabItem>
</TabControl>
</Grid>
基本上,<Image>
中的一张图片显示 tags 表示应用已连接到服务器,显示 other 图像表示应用未连接到服务器。它们都被放置在应用程序内部的相同位置,并且有一个方法检查应用程序是否连接到服务器,并根据该方法返回的值显示适当的图像。
我想做的是移动这些 <Image>
标签进入主<TabControl>
标签,以便这些图像可以显示在“选项卡菜单”上,但显示在窗口的最右侧(因为用户可用的各种选项卡显示在最左侧)。这意味着无论用户当前正在查看哪个选项卡,这些图像都会显示。
有什么办法可以做到这一点吗?我试过添加 <Image>
直接在 <TabControl>
内的标签标签,但是当我运行我的应用程序时图像没有显示...有人对我如何在这里实现我想要做的事情有任何建议吗?
最佳答案
要添加虚构的TabBar,您应该在TabControl
的Template
中创建新的RowDefinition
。让我举个例子:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" xmlns:System="clr-namespace:System;assembly=mscorlib" x:Class="WpfApplication2.MainWindow"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<SolidColorBrush x:Key="TabItem.Selected.Background" Color="#FFFFFF"/>
<SolidColorBrush x:Key="TabItem.Selected.Border" Color="#ACACAC"/>
<Style x:Key="TabControlStyle1" TargetType="{x:Type TabControl}">
<Setter Property="Padding" Value="2"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="{StaticResource TabItem.Selected.Background}"/>
<Setter Property="BorderBrush" Value="{StaticResource TabItem.Selected.Border}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabControl}">
<Grid x:Name="templateRoot" ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="ColumnDefinition0"/>
<ColumnDefinition x:Name="ColumnDefinition1" Width="0"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition x:Name="RowDefinition0" Height="Auto"/>
<RowDefinition x:Name="RowDefinition2" Height="0.1*"/>
<RowDefinition x:Name="RowDefinition1" Height="*"/>
</Grid.RowDefinitions>
<TabPanel x:Name="headerPanel" Background="Yellow" Grid.Column="0" IsItemsHost="true" Margin="2,2,2,0" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" FlowDirection="RightToLeft">
<Image Source="/Images/1.png" />
<Image Source="/Images/2.png" />
<Image Source="/Images/3.png" />
</StackPanel>
<Border x:Name="contentPanel" BorderBrush="Green" BorderThickness="5" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="2" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="TabStripPlacement" Value="Bottom">
<Setter Property="Grid.Row" TargetName="headerPanel" Value="1"/>
<Setter Property="Grid.Row" TargetName="contentPanel" Value="0"/>
<Setter Property="Height" TargetName="RowDefinition0" Value="*"/>
<Setter Property="Height" TargetName="RowDefinition1" Value="Auto"/>
<Setter Property="Margin" TargetName="headerPanel" Value="2,0,2,2"/>
</Trigger>
<Trigger Property="TabStripPlacement" Value="Left">
<Setter Property="Grid.Row" TargetName="headerPanel" Value="0"/>
<Setter Property="Grid.Row" TargetName="contentPanel" Value="0"/>
<Setter Property="Grid.Column" TargetName="headerPanel" Value="0"/>
<Setter Property="Grid.Column" TargetName="contentPanel" Value="1"/>
<Setter Property="Width" TargetName="ColumnDefinition0" Value="Auto"/>
<Setter Property="Width" TargetName="ColumnDefinition1" Value="*"/>
<Setter Property="Height" TargetName="RowDefinition0" Value="*"/>
<Setter Property="Height" TargetName="RowDefinition1" Value="0"/>
<Setter Property="Margin" TargetName="headerPanel" Value="2,2,0,2"/>
</Trigger>
<Trigger Property="TabStripPlacement" Value="Right">
<Setter Property="Grid.Row" TargetName="headerPanel" Value="0"/>
<Setter Property="Grid.Row" TargetName="contentPanel" Value="0"/>
<Setter Property="Grid.Column" TargetName="headerPanel" Value="1"/>
<Setter Property="Grid.Column" TargetName="contentPanel" Value="0"/>
<Setter Property="Width" TargetName="ColumnDefinition0" Value="*"/>
<Setter Property="Width" TargetName="ColumnDefinition1" Value="Auto"/>
<Setter Property="Height" TargetName="RowDefinition0" Value="*"/>
<Setter Property="Height" TargetName="RowDefinition1" Value="0"/>
<Setter Property="Margin" TargetName="headerPanel" Value="0,2,2,2"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="FooTabControl" TargetType="{x:Type TabControl}">
<!--This style is intended to be empty just for show that you can declare as many styles as you want-->
</Style>
<Style x:Key="FooButton" TargetType="{x:Type Button}">
<!--This style is intended to be empty just for show that you can declare as many styles as you want-->
</Style>
</Window.Resources>
<Grid Name="grid">
<TabControl Style="{DynamicResource TabControlStyle1}">
<TabItem Header="1">1</TabItem>
<TabItem Header="2">2</TabItem>
<TabItem Header="3">3</TabItem>
</TabControl>
</Grid>
</Window>
关于c# - XAML- 如何将图像添加到 <TabControl> 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37211594/