如何在WPF中为Tab控件提供自定义形状?

MERUN KUMAR MAITY

在此处输入图片说明

我在WPF中制作了一个应用程序,需要在其中使用TabControl在目录之间进行切换。但是由于设计目的,我的Tab项的内容在同一水平线后跟Tab项标题。

这是我的Mainwindow.xaml的代码

<Grid Width="635" HorizontalAlignment="Left" Height="458" VerticalAlignment="Top" Margin="0,61,0,0" >



            <TabControl Margin="-1" BorderThickness="0" Background="#222222" >
               
                <TabItem   Style="{StaticResource TabItemDefaults}"                            Header="File manager"  FontSize="10" Foreground="#efefef" Margin="5,0,0,0" Width="97" Height="20"   FontFamily="Segoe UI" UseLayoutRounding="True" TextOptions.TextFormattingMode="Display"                        >

                    <Grid>
                        <Label Name="Folder" Content="Folder:"  FontSize="10" Foreground="#efefef"   Height="20" Width="40"  Margin="-571,-367,0,0"   FontFamily="Segoe UI" UseLayoutRounding="True" TextOptions.TextFormattingMode="Display"                                  />
                        <Button Name ="FolderSelect"                               Width="532" HorizontalAlignment="Left" VerticalAlignment="Top"  Height="33" Margin="85,17,0,0"     Background="#1a1a1a"   
                            
                            materialDesign:ShadowAssist.ShadowDepth="Depth0" materialDesign:RippleAssist.Feedback="Transparent" BorderThickness="0"  UseLayoutRounding="True"
                            
                            ></Button>
                        <Label Name="ShowFolders" Content=".." Margin="-479,59,0,0"  Background="#1a1a1a"  Width="168" Height="373"  Foreground="#efefef" ></Label>


                        <Button
    Style="{StaticResource MaterialDesignRaisedButton}"
                           
                            
    Width="65" HorizontalAlignment="Left" Height="25" Background="#FF403D3D" Margin="16,292,0,0" 
                            
                           
    ToolTip="Resource name: MaterialDesignRaisedButton">
                            <materialDesign:PackIcon Kind="PlusThick" />

                        </Button>

                        <Button
    Style="{StaticResource MaterialDesignRaisedButton}"
    Width="65" HorizontalAlignment="Left" Height="25" Background="#FF403D3D" Margin="82,292,0,0" 
    ToolTip="Open output folder">
                            <materialDesign:PackIcon Kind="FolderUpload" />
                        </Button>

                        <Label Content="Video recordings:" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="269.2,-22,0,0" Foreground="#efefef"  FontSize="10"  FontFamily="Segoe UI" UseLayoutRounding="True" TextOptions.TextFormattingMode="Display" />
    
                    </Grid>    
                </TabItem>
                <TabItem   Style="{StaticResource TabItemDefaults}"                                           Header ="Preview"   FontSize="10" Foreground="#efefef" Width="67" Height="20" Margin="-8,0,0,0"  FontFamily="Segoe UI" UseLayoutRounding="True" TextOptions.TextFormattingMode="Display"                  >

                    <Grid>
                        <CheckBox Content="Draggable mode" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="520,-22,0,0"     Width="110"                                    />


                    </Grid>

                </TabItem>

            </TabControl>


        </Grid>

Tab控件和Tab项均由我在App.xaml中声明的控件模板制成。

这是我在App.xaml中分别声明的Tab控件的代码-

<Style  TargetType="{x:Type TabControl}"  x:Key="TabControlDefaults"  x:Name="NewTabcontrol" >
                <Setter Property="OverridesDefaultStyle"
          Value="True" />
                <Setter Property="SnapsToDevicePixels"
          Value="True" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TabControl}">
                            <Grid KeyboardNavigation.TabNavigation="Local">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                    <RowDefinition Height="*" />
                                </Grid.RowDefinitions>
                                <VisualStateManager.VisualStateGroups>
                                    <VisualStateGroup x:Name="CommonStates">
                                        <VisualState x:Name="Disabled">
                                            <Storyboard>
                                                <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                                Storyboard.TargetProperty="(Border.BorderBrush).
                    (SolidColorBrush.Color)">
                                                    <EasingColorKeyFrame KeyTime="0"
                                         Value="#FFAAAAAA" />
                                                </ColorAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </VisualState>
                                    </VisualStateGroup>
                                </VisualStateManager.VisualStateGroups>
                                <TabPanel x:Name="HeaderPanel"
                    Grid.Row="0"
                    Panel.ZIndex="1"
                    Margin="0,0,4,-1"
                    IsItemsHost="True"
                    KeyboardNavigation.TabIndex="1"
                    Background="Transparent" />
                                <Border x:Name="Border"
                  Grid.Row="1"
                  BorderThickness="1"
                  CornerRadius="2"
                  KeyboardNavigation.TabNavigation="Local"
                  KeyboardNavigation.DirectionalNavigation="Contained"
                  KeyboardNavigation.TabIndex="2">
                                    <Border.Background>
                                        <LinearGradientBrush EndPoint="0.5,1"
                                   StartPoint="0.5,0">
                                            <GradientStop Color="{DynamicResource ContentAreaColorLight}"
                              Offset="0" />
                                            <GradientStop Color="{DynamicResource ContentAreaColorDark}"
                              Offset="1" />
                                        </LinearGradientBrush>
                                    </Border.Background>
                                    <Border.BorderBrush>
                                        <SolidColorBrush Color="{DynamicResource BorderMediumColor}"/>
                                    </Border.BorderBrush>
                                    <ContentPresenter x:Name="PART_SelectedContentHost"
                              Margin="4"
                              ContentSource="SelectedContent" />
                                </Border>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

这是我在App.xaml中分别声明的Tab项的代码-

<Style TargetType="{x:Type TabItem}" x:Key="TabItemDefaults" x:Name="NewTabitem"   >

                <Setter Property="Foreground" Value="#bababa" />

                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TabItem}">
                            <Grid x:Name="Panel"    ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local"                                                      >
                                <ContentPresenter x:Name="ContentSite"
                                        VerticalAlignment="Center"
                                        HorizontalAlignment="Center"
                                        ContentSource="Header"
                                        Margin="10,2"/>
                            
                            
                            </Grid>
                            
                           
                            <ControlTemplate.Triggers>


                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter Property="Foreground" Value="Black"/>
                                </Trigger>



                                <Trigger Property="IsSelected" Value="True">
                                    <!--    <Setter TargetName="Panel" Property="Background" Value="LightSkyBlue"  /> -->
                                    <Setter Property="HeaderTemplate">
                                        <Setter.Value>
                                            <DataTemplate>
                                                <TextBlock Text="{TemplateBinding Content}">

                                                    <TextBlock.TextDecorations>
                                                        <TextDecoration  PenOffset="4" PenOffsetUnit="Pixel" >
                                                            <TextDecoration.Pen>
                                                                <Pen Brush="#673ab7" Thickness="4" />
                                                            </TextDecoration.Pen>
                                                        </TextDecoration>
                                                    </TextBlock.TextDecorations>

                                                </TextBlock>
                                            </DataTemplate>
                                        </Setter.Value>
                                    </Setter>


                                </Trigger>
                                <Trigger Property="IsSelected" Value="False">
                                    <Setter TargetName="Panel" Property="Background" Value="#212121" />
                                    <Setter Property="Foreground" Value="WhiteSmoke"/>

                                </Trigger>

                              
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

我的问题是复选框(我给一个红色圆圈)不能正常运行。我知道主要原因是该复选框位于“选项卡控件”的选项卡面板之外。但出于我的应用程序的设计目的,我必须将其放置在此处。

因此,如何为Tab控件的选项卡面板提供自定义形状,以便将内容元素完美地停靠在所需的位置。

大西天MSFT

您的CheckBox不能被选择,您可以使用DataTrigger使chexkbox可见或隐藏,具体取决于是否选择了Preview TabItem。

我对您的MainWindow.xaml进行了一些更新,以使该复选框可以被选中。

  <StackPanel Width="635" HorizontalAlignment="Left" Height="458" VerticalAlignment="Top" Margin="0,61,0,0" >

    <CheckBox Content="Draggable mode" HorizontalAlignment="Right" VerticalAlignment="Top" Width="110" >
        <CheckBox.Style>
            <Style TargetType="CheckBox">
                <Setter Property="Visibility" Value="Hidden"></Setter>
                <Setter Property="IsEnabled" Value="False"></Setter>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=myTabControl,Path=SelectedItem.Header}" Value="Preview" >
                        <Setter Property="Visibility" Value="Visible"></Setter>
                        <Setter Property="IsEnabled" Value="True"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </CheckBox.Style>
    </CheckBox>

    <TabControl BorderThickness="0" Background="#222222"  Name="myTabControl" SelectionChanged="myTabControl_SelectionChanged">

        <TabItem   Style="{StaticResource TabItemDefaults}" Header="File manager"  FontSize="10" Foreground="#efefef" Margin="5,0,0,0" Width="97" Height="20"   FontFamily="Segoe UI" UseLayoutRounding="True" TextOptions.TextFormattingMode="Display"                        >
            <Grid Height="300">
            </Grid>
        </TabItem>
        <TabItem Style="{StaticResource TabItemDefaults}" Header ="Preview"   FontSize="10" Foreground="#efefef" Width="67" Height="20"  FontFamily="Segoe UI" UseLayoutRounding="True" TextOptions.TextFormattingMode="Display"                  >
            <Grid Height="300">
            </Grid>
        </TabItem>
    </TabControl>
</StackPanel>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 c# WPF 中为自定义形状对象设置动画

来自分类Dev

如何在自定义控件中为内部DataGrid定义列

来自分类Dev

如何在WPF中的FormattedText的简单自定义控件中设置依赖项属性AddOwner

来自分类Dev

如何在 wpf 中制作自定义形状的进度条?

来自分类Dev

如何在自定义WPF控件(如折线图)中呈现动态数据?

来自分类Dev

如何在WPF中的自定义窗口中查找控件

来自分类Dev

如何在自定义WPF控件(如折线图)中呈现动态数据?

来自分类Dev

如何在XAML WPF中访问自定义控件的属性

来自分类Dev

WPF:如何使自定义控件中的文本显示?

来自分类Dev

如何在UIView中为表格视图标题部分绘制自定义形状?

来自分类Dev

如何在XAML中为自定义DataGrid控件指定GroupDescriptions?

来自分类Dev

如何在下拉菜单控件中为Excel自定义功能区控件设置默认值

来自分类Dev

如何在自定义形状xml中添加图像

来自分类Dev

如何在Flutter中制作自定义按钮形状

来自分类Dev

如何在SwiftUI中绘制自定义形状?

来自分类Dev

如何在自定义形状xml中添加图像

来自分类Dev

如何在画面中添加自定义形状?

来自分类Dev

如何在DateTimePicker控件中自定义日历?

来自分类Dev

如何在 Leaflet 中创建自定义设置控件

来自分类Dev

如何在表单中动态添加自定义控件

来自分类Dev

如何在 JavaFX 中制作自定义 LineChart 控件?

来自分类Dev

如何在自定义控件中添加所需的星号?

来自分类Dev

如何在透视中为列提供自定义名称

来自分类Dev

如何在蛋糕3中为Flash消息提供自定义的CSS类

来自分类Dev

如何在TreeView中为工具提示提供MaxWidth(或自定义样式)

来自分类Dev

如何在Django表单中为窗口小部件提供自定义名称

来自分类Dev

如何在C#中为dateTimePicker提供自定义格式

来自分类Dev

如何在XAML文件中的mapControl上为ImageTilesLayer的DataProvider提供自定义数据?

来自分类Dev

如何在Python中为字符串对象提供自定义方法?

Related 相关文章

  1. 1

    如何在 c# WPF 中为自定义形状对象设置动画

  2. 2

    如何在自定义控件中为内部DataGrid定义列

  3. 3

    如何在WPF中的FormattedText的简单自定义控件中设置依赖项属性AddOwner

  4. 4

    如何在 wpf 中制作自定义形状的进度条?

  5. 5

    如何在自定义WPF控件(如折线图)中呈现动态数据?

  6. 6

    如何在WPF中的自定义窗口中查找控件

  7. 7

    如何在自定义WPF控件(如折线图)中呈现动态数据?

  8. 8

    如何在XAML WPF中访问自定义控件的属性

  9. 9

    WPF:如何使自定义控件中的文本显示?

  10. 10

    如何在UIView中为表格视图标题部分绘制自定义形状?

  11. 11

    如何在XAML中为自定义DataGrid控件指定GroupDescriptions?

  12. 12

    如何在下拉菜单控件中为Excel自定义功能区控件设置默认值

  13. 13

    如何在自定义形状xml中添加图像

  14. 14

    如何在Flutter中制作自定义按钮形状

  15. 15

    如何在SwiftUI中绘制自定义形状?

  16. 16

    如何在自定义形状xml中添加图像

  17. 17

    如何在画面中添加自定义形状?

  18. 18

    如何在DateTimePicker控件中自定义日历?

  19. 19

    如何在 Leaflet 中创建自定义设置控件

  20. 20

    如何在表单中动态添加自定义控件

  21. 21

    如何在 JavaFX 中制作自定义 LineChart 控件?

  22. 22

    如何在自定义控件中添加所需的星号?

  23. 23

    如何在透视中为列提供自定义名称

  24. 24

    如何在蛋糕3中为Flash消息提供自定义的CSS类

  25. 25

    如何在TreeView中为工具提示提供MaxWidth(或自定义样式)

  26. 26

    如何在Django表单中为窗口小部件提供自定义名称

  27. 27

    如何在C#中为dateTimePicker提供自定义格式

  28. 28

    如何在XAML文件中的mapControl上为ImageTilesLayer的DataProvider提供自定义数据?

  29. 29

    如何在Python中为字符串对象提供自定义方法?

热门标签

归档