tabcontrol width wpf

#wpf #width #tabcontrol

#wpf #ширина #tabcontrol

Вопрос:

У меня есть TabControl с n вкладками. Я пытаюсь ограничить ширину TabControl, чтобы, если у меня осталась только одна вкладка, ее заголовок всегда был виден при изменении размера главного окна, содержащего Tabcontrol. Есть предложения?

Комментарии:

1. Я не понимаю проблему / вопрос. Исчезает ли заголовок tabitem tabcontrol при изменении размера окна?

2. Было бы предложено показать некоторый код, который вызывает такое поведение.

Ответ №1:

Обычно я бы скрывал вкладку, когда остается только один элемент:

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

Если вы хотите отобразить что-то вместо этого, вы могли бы поместить это выше и показывать только тогда, когда количество уменьшится до 1.

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

Одним из приближений было бы привязать к ширине TabControl:

 <TabControl.ItemContainerStyle>
    <Style TargetType="{x:Type TabItem}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TabControl}, Path=Items.Count}"
                     Value="1">
                <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource AncestorType=TabControl}, Path=ActualWidth}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</TabControl.ItemContainerStyle>
  

Но это немного великовато, возможно, вам захочется вычесть небольшое значение с помощью ValueConverter.

Правка2: вот так:

 <Style TargetType="{x:Type TabItem}">
    <Style.Resources>
        <local:AddConverter x:Key="AddConverter"/>
    </Style.Resources>
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TabControl}, Path=Items.Count}"
                 Value="1">
            <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource AncestorType=TabControl},
                                                     Path=ActualWidth,
                                                     Converter={StaticResource AddConverter},
                                                     ConverterParameter=-5}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
  
 public class AddConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double input = (double)value;
        double input2 = double.Parse(parameter as string);
        return input   input2;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double input = (double)value;
        double input2 = double.Parse(parameter as string);
        return input - input2;
    }
}