ширина вкладки wpf - PullRequest
       9

ширина вкладки wpf

0 голосов
/ 21 апреля 2011

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

1 Ответ

1 голос
/ 21 апреля 2011

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

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

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

Одним из приближений будет привязка к ширине 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 .

Edit2: Как это:

<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;
    }
}
...