oistrez Ответов: 1

Как я могу задать высоту динамически созданный вкладке "колонтитулы" в WPF?


Всем привет,

к сожалению, я вынужден манипулировать кодом, который другие создали много лет назад. Решение представляет собой приложение WPF (с Caliburn.Микро и Ninject).
Внутри показанного DevExpress DockLayoutManager создается TabControl и динамически добавляются вкладки. Таким образом, в XAML не появляется вкладка.

Единственное, что я хочу сделать, - это повлиять на высоту заголовка вкладки.
Я действительно перепробовал все, что мог себе представить или найти, включая подсказки на всех форумах. Но нигде я не мог получить доступ к заголовку или даже к одной вкладке, ни в XAML, ни в коде позади. Там, кажется, нет никакой вкладки или итерации заголовка. Что вы должны знать: к сожалению, элементы в ItemSource - это не TabItems, а пользовательские объекты. Так что у них тоже нет заголовка...

Есть идеи??? Самым хорошим решением было бы установить
<UserControl x:Class="Jenoptik.TS.TDSKpro.Studio.Common.Views.Details.DetailsView"

             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

             xmlns:viewModels="clr-namespace:Jenoptik.TS.TDSKpro.Studio.Common.ViewModels.Details"

             xmlns:cal="http://www.caliburnproject.org"

             xmlns:dxdo="http://schemas.devexpress.com/winfx/2008/xaml/docking"

             xmlns:details="clr-namespace:Jenoptik.TS.TDSKpro.Studio.Common.Views.Details"

             mc:Ignorable="d" 

             d:DataContext="{d:DesignInstance viewModels:DetailsViewModel}"

             Grid.IsSharedSizeScope="True">
    <UserControl.Resources>
        <Style TargetType="{x:Type Grid}">
            <Setter Property="VerticalAlignment" Value="Top" />
        </Style>
        <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
            <Setter Property="Margin" Value="5,2" />
            <Setter Property="IsReadOnly" Value="True" />
        </Style>
        <Style x:Key="ComboBoxBaseStyle" TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
            <Setter Property="Margin" Value="5,2" />
            <Setter Property="MaxWidth" Value="175" />
        </Style>
        <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource ComboBoxBaseStyle}" />
        <Style x:Key="LabelBaseStyle" TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type Label}}">
            <Setter Property="Margin" Value="5,2" />
        </Style>
        <Style TargetType="{x:Type Label}" BasedOn="{StaticResource LabelBaseStyle}"/>
        <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource {x:Type CheckBox}}">
            <Setter Property="Margin" Value="5" />
        </Style>
        <Style x:Key ="ViolationGradingStyleComboBox" TargetType="ComboBox" BasedOn="{StaticResource ComboBoxBaseStyle}">
            <Setter Property="Visibility" Value="{Binding LookupItemsConfiguration.SupportsViolationGradings, Converter={StaticResource BooleanToVisibilityConverter}}" />
            <Style.Triggers>
                <DataTrigger  Binding="{Binding ViolationGradings.Count}" Value="0">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <Style x:Key ="ViolationGradingStyleLabel" TargetType="Label" BasedOn="{StaticResource LabelBaseStyle}">
            <Setter Property="Visibility" Value="{Binding LookupItemsConfiguration.SupportsViolationGradings, Converter={StaticResource BooleanToVisibilityConverter}}" />
            <Style.Triggers>
                <DataTrigger  Binding="{Binding ViolationGradings.Count}" Value="0">
                    <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </UserControl.Resources>
    <dxdo:DockLayoutManager

        ItemsSource="{Binding Items}"

        Height="235"

        ManualClosedPanelsBarVisibility="False"

        ShowInvisibleItemsInCustomizationForm="False"

        ShowInvisibleItems="False"

        ClosedPanelsBarPosition="Bottom"

        ClosedPanelsBarVisibility="Never"

        x:Name="DockLayoutManager">
        <dxdo:MVVMHelper.LayoutAdapter>
            <details:LayoutAdapter/>
        </dxdo:MVVMHelper.LayoutAdapter>
        <dxdo:DockLayoutManager.Resources>
            <Style TargetType="{x:Type dxdo:DocumentPanel}">
Value="10"></Setter>
                <Setter Property="VerticalContentAlignment" Value="Top"/>
                <Setter Property="CustomizationCaption" Value="{Binding Caption}"/>
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Border Margin="5" Padding="5" >
                                <Border.Background>
                                    <SolidColorBrush Color="{DynamicResource Color_05_pantone_gray_20}" />
                                </Border.Background>
                                <ScrollViewer Name="ScrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                                    <ContentControl cal:View.Model="{Binding}"/>
                                </ScrollViewer>
                            </Border>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="CaptionTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" VerticalAlignment="Top">
                                <Image Height="16" Margin="5,0,0,0" Source="{Binding CaptionImagePath}"/>
                                <Label Content="{Binding Caption}" />
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="BindableName" Value="{Binding Identifier}" />
                <Style.Triggers>
                    <DataTrigger  Binding="{Binding IsVisible}" Value="false">
                        <Setter Property="Visibility" Value="Collapsed" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </dxdo:DockLayoutManager.Resources>
        <dxdo:DockLayoutManager.LayoutRoot>
            <dxdo:LayoutGroup Name="LayoutGroup">
                <dxdo:DocumentGroup Name="DetailsGroup" />
            </dxdo:LayoutGroup>
        </dxdo:DockLayoutManager.LayoutRoot>
    </dxdo:DockLayoutManager>
</UserControl>

Та же проблема существует и для этого более простого представления:
<UserControl x:Class="Jenoptik.TS.TDSKpro.Studio.Common.Views.DocumentView"

             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

             xmlns:cal="http://www.caliburnproject.org"

             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

             d:DesignHeight="300"

             d:DesignWidth="300"

             mc:Ignorable="d">

    <TabControl x:Name="SegmentTabs"

                Foreground="Transparent"

                ItemsSource="{Binding Items}"

                SelectedItem="{Binding ActiveItem}">
        <tabcontrol.background>
            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                <GradientStop Offset="1" Color="#FFDEDFE0" />
                <GradientStop Color="White" />
            
        
        <tabcontrol.itemtemplate>
            <datatemplate>
                <TextBlock Text="{Binding DisplayName}" />
            
        
        <tabcontrol.contenttemplate>
            <datatemplate>
                <ContentControl HorizontalContentAlignment="Stretch"

                                VerticalContentAlignment="Stretch"

                                cal:View.Model="{Binding}" />


Что я уже пробовал:

установка высоты везде в XAML
доступ к вкладке управления и ее вкладки и заголовки

1 Ответов

Рейтинг:
1

johannesnestler

Привет ойстрез,

Вы используете "ItemTemplate"(кстати, почему XAML не корректен в вашем примере = нижний регистр itemtemplate...)
Таким образом, это то, что управляет "внутри" вашего заголовка вкладки.

Вы используете здесь только текстовый блок - так что вы можете установить его Height просто контролируя DataTemplate
подобный этому

TabControl.ItemTemplate>
<DataTemplate>
 <TextBlock Text="{Binding DisplayName}" Height="50">
...


Другим способом было бы непосредственно манипулировать ControlTemplate, который находится за TabItem (надеюсь, вы знаете, как генерировать их в VS-если вы не видите их в своей кодовой базе?)
Так как пример я вам по умолчанию (для Windows-темы) tabitem в
      <Style x:Key="TabItemStyle1" TargetType="{x:Type TabItem}">
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="Background" Value="{StaticResource TabItem.Static.Background}"/>
            <Setter Property="BorderBrush" Value="{StaticResource TabItem.Static.Border}"/>
            <Setter Property="Margin" Value="0"/>
            <Setter Property="Padding" Value="6,2,6,2"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Stretch"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid x:Name="templateRoot" SnapsToDevicePixels="true">
                            <Border x:Name="mainBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" Background="{TemplateBinding Background}" Margin="0">
                                <Border x:Name="innerBorder" BorderBrush="{StaticResource TabItem.Selected.Border}" BorderThickness="1,1,1,0" Background="{StaticResource TabItem.Selected.Background}" Margin="-1" Opacity="0"/>
                            </Border>
                            <ContentPresenter x:Name="contentPresenter" ContentSource="Header" Focusable="False" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                        </Grid>
...


Вы видите ContentPresenter, который отвечает за отображение заголовка - вы можете заменить его чем угодно...

Я надеюсь, что это поможет,

С уважением

Иоганнес