Есть ли способ сделать последнюю вкладку TabControl правой кнопкой? Хотите сделать последнее отдельно от первых нескольких.Как правильно выровнять последнюю вкладку TabControl?
Спасибо!
Есть ли способ сделать последнюю вкладку TabControl правой кнопкой? Хотите сделать последнее отдельно от первых нескольких.Как правильно выровнять последнюю вкладку TabControl?
Спасибо!
Here - пример проекта по шаблонам вкладок TabControl. Я бы, вероятно, использовал Grid с тремя столбцами шириной «Auto», * и «Auto» и поставил StackPanel в первом столбце, чтобы удерживать первый набор вкладок, а затем только последнюю вкладку сам по себе в последнем столбце со средней столбец пуст и просто занимает оставшееся пространство.
Это сообщение может быть старым, но я наткнулся на него, ища ответ на тот же вопрос, поэтому я подумал, что поделюсь быстрым и грязным решением, в котором я оказался.
Я просто поставить два 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;
}
Если вы хотите иметь две вкладки слева и один справа, вы можете иметь третью невидимую вкладку Inbetween и 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>
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
}
Downvoters. , Будете ли вы оставлять комментарий о том, почему это запрещено. Это простейшее рабочее решение для вопроса. – Gopichandar
я не смог нажать на вкладку подстилающей. добавление обработчика события 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
@Derrick - Спасибо! Для меня предложенный ответ отлично работал в режиме отладки, но когда я в конце концов выпустил приложение, я обнаружил, что должен был сделать подобный трюк. – Sphinxxx