Dirkster99 / AvalonDock

Our own development branch of the well known WPF document docking library
Microsoft Public License
1.41k stars 321 forks source link

How do I move the AvalonDock Anchorable Pane tab to the top instead of the bottom? #430

Closed uzername closed 1 year ago

uzername commented 1 year ago

Hello. In example, tabs of Anchorable Pane are located at bottom, but I'd like to have them placed on top, like in Document Pane. I checked this page: https://github.com/Dirkster99/AvalonDock/wiki/LayoutAnchorablePaneControl but there is no appropriate method for this. A similar LayoutDocumentPaneControl has 'TabStripPlacement'. I checked this answer : https://stackoverflow.com/questions/29434424/how-do-i-move-the-avalondock-anchorable-pane-tab-to-the-top-instead-of-the-botto It offers workaround, but it is not that elegant. Is it possible to achieve this without implementing custom style?

uzername commented 1 year ago

Okay, so the above mentioned answer from stackoverflow worked. For completeness, I post the fragment here:

<Style x:Key="MyCustomAnchorablePaneControlStyle" TargetType="{x:Type xcad:LayoutAnchorablePaneControl}">

    <Setter Property="TabStripPlacement" Value="Top"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type xcad:LayoutAnchorablePaneControl}">
                <Grid ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <!--Following border is required to catch mouse events-->
                    <Border Background="Transparent" Grid.RowSpan="2"/>

                    <xcad:AnchorablePaneTabPanel x:Name="HeaderPanel" Margin="2,0,2,2" IsItemsHost="true" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/>

                    <Border x:Name="ContentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Cycle">
                        <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </Border>

                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                <Setter Property="ToolTip" Value="{Binding ToolTip}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}, Path=Items.Count}" Value="1">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Setter.Value>
    </Setter>

    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <xcad:LayoutAnchorableTabItem Model="{Binding}"/>
            </DataTemplate>
        </Setter.Value>
    </Setter>

    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <xcad:LayoutAnchorableControl Model="{Binding}"/>
            </DataTemplate>
        </Setter.Value>
    </Setter>

</Style>

That went to Resources section of App.Xaml. I applied it in DockingManager form xaml like this:

<DockingManager x:Name="dockManager"
            Grid.Row="1"
            AllowMixedOrientation="True"
            AutoWindowSizeWhenOpened="True"
            IsVirtualizingAnchorable="True"
            IsVirtualizingDocument="True"
            AnchorablePaneControlStyle="{StaticResource MyCustomAnchorablePaneControlStyle}" >
....
</DockingManager>

Tabs went to top, that's for Anchorable