ButchersBoy / Dragablz

Dragable and tearable tab control for WPF
http://dragablz.net
MIT License
2.17k stars 321 forks source link

The HeaderSuffixContent is hidden sometimes. #208

Open pgbo opened 6 years ago

pgbo commented 6 years ago

image

image

I check the Generic.xaml, ans saw below code of TabablzControl style.

<Grid Grid.Column="0" Grid.Row="0" Margin="0,0,0,0" x:Name="HeaderContainerGrid" Visibility="{TemplateBinding IsHeaderPanelVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
    <Grid.Resources>
        <Style TargetType="{x:Type Button}" BasedOn="{StaticResource StandardEmbeddedButtonStyle}"></Style>
    </Grid.Resources>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <ContentControl Grid.Column="0" x:Name="PrefixContentControl" 
        Content="{TemplateBinding HeaderPrefixContent}"
        ContentStringFormat="{TemplateBinding HeaderPrefixContentStringFormat}"
        ContentTemplate="{TemplateBinding HeaderPrefixContentStringFormat}"
        ContentTemplateSelector="{TemplateBinding HeaderPrefixContentTemplateSelector}"/>
    <local:DragablzItemsControl x:Name="PART_HeaderItemsControl"                                                         
                    Grid.Column="1"
                    ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Items}"                                                                                                            
                    ItemContainerStyle="{TemplateBinding ItemContainerStyle}"
                    ItemsOrganiser="{TemplateBinding HeaderItemsOrganiser}"
                    KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"
                    ItemTemplate="{TemplateBinding HeaderItemTemplate}"
                    FixedItemCount="{TemplateBinding FixedHeaderCount}"
                    Style="{StaticResource TabablzDragablzItemsControlStyle}">
        <local:DragablzItemsControl.MaxWidth>
            <MultiBinding>
                <MultiBinding.Converter>
                    <local:TabablzHeaderSizeConverter Orientation="Horizontal"/>
                </MultiBinding.Converter>
                <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="ActualWidth" />
                <Binding RelativeSource="{RelativeSource Self}" Path="ItemsPresenterWidth" />
                <Binding ElementName="PrefixContentControl" Path="ActualWidth" />
                <Binding ElementName="DefaultAddButton" Path="DesiredSize.Width" />
                <Binding ElementName="SuffixContentControl" Path="DesiredSize.Width" />
            </MultiBinding>
        </local:DragablzItemsControl.MaxWidth>
    </local:DragablzItemsControl>
    <Button Style="{StaticResource AddItemCommandButtonStyle}"
            x:Name="DefaultAddButton"
            Grid.Column="2"
            Command="{x:Static local:TabablzControl.AddItemCommand}"
            Visibility="{TemplateBinding ShowDefaultAddButton, Converter={StaticResource BooleanToVisibilityConverter}}"
            />
    <ContentControl Grid.Column="3" x:Name="SuffixContentControl" 
            Content="{TemplateBinding HeaderSuffixContent}"
            ContentStringFormat="{TemplateBinding HeaderSuffixContentStringFormat}"
            ContentTemplate="{TemplateBinding HeaderSuffixContentTemplate}"
            ContentTemplateSelector="{TemplateBinding HeaderSuffixContentTemplateSelector}"                                            
            HorizontalAlignment="Stretch"
            />
</Grid>

I realized that the SuffixContentControl's DesizredSize.WIdth is 0 when PART_HeaderItemsControl's width is large enough. so SuffixContentControl is hidden.

After I add MinWidth for the column show SuffixContentControl like below, the SuffixContentControl is visiable again.

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="*"  MinWidth="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HeaderSuffixContentMinimumSize.Width}"/>
</Grid.ColumnDefinitions>

As you can see, I alter the TabablzControl class, add a DependencyProperty HeaderSuffixContentMinimumSize in it. And you can use TabablzControl in your code like below:

<dragablz:TabablzControl 
        ItemsSource="{Binding WorkspaceItems}"
        SelectedItem="{Binding ActiveWorkspaceItem, Mode=TwoWay}"
        FixedHeaderCount="{Binding FixedItemCount}"
        ShowDefaultCloseButton="True"
        ShowDefaultAddButton="False"
        AdjacentHeaderItemOffset="-15"
        BorderBrush="{DynamicResource BorderBrushDefault}"
        ClosingItemCallback="{Binding ElementName=UserControlRoot, Path=WorkspaceItemClosing}"
        ItemContainerStyle="{StaticResource WorkspaceDragableTabItemStyleInner}"
        x:Name="TabablzControlSelf">
        <dragablz:TabablzControl.InterTabController>
            <dragablz:InterTabController InterTabClient="{Binding InterTabClient}"/>
        </dragablz:TabablzControl.InterTabController>

        <dragablz:TabablzControl.HeaderSuffixContentMinimumSize>
            <Size Width="28"/>
        </dragablz:TabablzControl.HeaderSuffixContentMinimumSize>
        <dragablz:TabablzControl.HeaderSuffixContent>
            <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Center"
                        x:Name="HeaderSuffixContentContainerView">
                <Button HorizontalAlignment="Left" Margin="4,0" 
                    Style="{StaticResource GeometryContentButtonStyleDefault}"
                    Command="{Binding NewCommand}"
                    Width="20"
                    Height="20"
                    Styles:StylesHelper.CornerRadius="0,0,0,0"
                    BorderThickness="0"
                    Padding="0">
                    Add+
                </Button>
            </StackPanel>
        </dragablz:TabablzControl.HeaderSuffixContent>
    </dragablz:TabablzControl>