c# - XAML- 如何将图像添加到 <TabControl> 标记

标签 c# wpf image xaml

我正在为我的应用程序开发一个“选项卡式”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,您应该在TabControlTemplate 中创建新的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/

相关文章:

c# - ToggleButton 内容绑定(bind)到它的状态

wpf - 在代码隐藏文本 block 中绑定(bind)字符串属性

c# - 直接调用 anon async Func 与使用 Task.Factory 之间的区别?

c# - 如何在所有应用程序中模拟键盘输入?

c# - 使用动态泛型类型参数创建泛型类的实例

javascript - 如何防止编译jar插件出错

image - 透明单像素图像的最小文件大小

c# - 从作为 LocalSystem 运行的 WCF 托管服务以特定用户身份启动进程

wpf - 绑定(bind)到内联数组声明内的 DataContext 属性

image - 在 Mongodb 中存储图像并使用 Nodejs 为它们提供服务