Как правильно выровнять последнюю вкладку TabControl? - PullRequest
3 голосов
/ 30 января 2012

Есть ли способ сделать последнюю вкладку в TabControl выровненной по правому краю? Хотите сделать последний отдельно от первых.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 02 декабря 2012

Это сообщение может быть старым, но я наткнулся на него, ища ответ на тот же вопрос, поэтому я решил поделиться быстрым и грязным решением, с которым я в итоге пришел.

Я просто поставилдва TabControls друг над другом в Grid, и выровняли TabPanel по правому краю на одном из них (спасибо, перейдите к Meleak ):

 <Grid>
    <TabControl x:Name="_tabsRight" GotFocus="OnTabFocused" >
        <TabControl.Resources>
            <Style TargetType="TabPanel">
                <Setter Property="HorizontalAlignment" Value="Right"/>
            </Style>
        </TabControl.Resources>

        <TabItem x:Name="JustAHiddenTabItemToDeselectTheRealOne" Visibility="Hidden" />

        <!-- Last tab -->
        <TabItem Header="Last one" >
            <!-- Last content... -->
        </TabItem>

    </TabControl>
    <TabControl x:Name="_tabsLeft" GotFocus="OnTabFocused" >

        <!-- First tab -->
        <TabItem Header="1st" >
            <!-- First content... -->
        </TabItem>

        <!-- Second tab -->
        <TabItem Header="2nd" >
            <!-- Second content... -->
        </TabItem>

    </TabControl>
</Grid>

Затем в событии OnTabFocusedобработчик, нам нужно вывести самый нижний TabControl вперед, когда пользователь нажимает TabItem:

private int _zIncrementor = 0;
/// <summary>
/// Hack to make two TabControls act as one.
/// </summary>
private void OnTabFocused(object sender, RoutedEventArgs e)
{
    var tab = (TabControl)sender;
    var otherTab = (tab == _tabsLeft) ? _tabsRight : _tabsLeft;

    Grid.SetZIndex(tab, ++_zIncrementor);
    otherTab.SelectedItem = null;
}
3 голосов
/ 30 января 2012

Здесь - пример проекта по шаблонированию вкладок TabControl.Я бы, вероятно, использовал Grid с тремя столбцами ширины «Auto», * и «Auto» и поместил бы StackPanel в первый столбец для хранения первого набора вкладок, а затем просто саму последнюю вкладку в последнем столбце с серединойстолбец пустой и просто занимает оставшееся место.

0 голосов
/ 01 марта 2016

Если вы хотите иметь две вкладки слева и одну справа, вы можете получить третью невидимую вкладку между ними, и width невидимой вкладки можно рассчитать, вычтя Width всех трех видимых вкладок из Actualwidth из Window, что дает нам оставшееся пространство.

Вот пример кода

<TabControl x:Name="_tabsLeft" GotFocus="OnTabFocused" >

    <!-- First tab -->
    <TabItem Header="1st" >
        <!-- First content... -->
    </TabItem>

    <!-- Second tab -->
    <TabItem Header="2nd" >
        <!-- Second content... -->
    </TabItem>

     <!-- Third invisible tab -->
    <TabItem Header="Im not visible in UI" Visibility="Hidden" x:Name="invisibletab" >
        <!-- I'm not visible in UI... -->
    </TabItem>

    <!-- Last tab -->
    <TabItem Header="Last one" >
        <!-- Last content... -->
    </TabItem>

</TabControl>

Код сервера:

public MainWindow()
{
    InitializeComponent();       
    this.SizeChanged += window_SizeChanged;
}
private void window_SizeChanged(object sender, SizeChangedEventArgs e)
{
    invisibletab.Width = this.ActualWidth - 550; // where the 550 is the sum of the actual width of visible tabs
}
...