2012-01-30 2 views

ответ

3

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

4

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

Я просто поставить два TabControls друг на друга в сетке, и выравнивается по правому краю в 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; 
} 
+1

я не смог нажать на вкладку подстилающей. добавление обработчика события mousedown через следующий код исправил его: private void _tabs_MouseLeftButtonDown (отправитель объекта, MouseButtonEventArgs e) { { Точка pt = e.GetPosition ((UIElement) отправитель); var element = this.InputHitTest (pt) as System.Windows.Controls.Primitives.TabPanel; if (element! = Null && _tabsLeft.IsAncestorOf (element)) { _tabsRight.Focus(); _tabsRight.SelectedIndex = 1; } } – Derrick

+1

@Derrick - Спасибо! Для меня предложенный ответ отлично работал в режиме отладки, но когда я в конце концов выпустил приложение, я обнаружил, что должен был сделать подобный трюк. – Sphinxxx

-1

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

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

<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> 

Backend Код:

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 
} 
+0

Downvoters. , Будете ли вы оставлять комментарий о том, почему это запрещено. Это простейшее рабочее решение для вопроса. – Gopichandar

Смежные вопросы