TabItem - как получить доступ к элементу в пользовательском HeaderTemplate из триггера стиля TabItem - PullRequest
0 голосов
/ 20 марта 2012

У меня есть следующий код:

<Window x:Class="kkk.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>

        <Style TargetType="{x:Type TabItem}" x:Key="maintemplate">

            <Style.Resources>
                <DataTemplate x:Key="headertemplate" DataType="{x:Type TabItem}">
                    <StackPanel Orientation="Horizontal">
                        <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem} }, Path=Header}"/>
                        <Button Content="X" x:Name="CloseButton">
                            <Button.LayoutTransform>
                                <ScaleTransform ScaleX="0.8" ScaleY="0.5"></ScaleTransform>
                            </Button.LayoutTransform>
                        </Button>
                    </StackPanel>
                </DataTemplate>
            </Style.Resources>

            <Setter Property="HeaderTemplate" Value="{StaticResource headertemplate}"></Setter>

        </Style>

    </Window.Resources>
    <Grid>

        <TabControl>
            <TabItem Header="tab1" Style="{StaticResource maintemplate}"></TabItem>
            <TabItem Header="tab1" Style="{StaticResource maintemplate}"></TabItem>
        </TabControl>

    </Grid>
</Window>

Он создает tabcontrol с маленькой кнопкой x на каждом заголовке tabitem (он будет использоваться для закрытия вкладки).Теперь я хочу скрыть эту кнопку, когда вкладка не выбрана.Я пытался что-то вроде:

<Style.Triggers>
                <Trigger Property="IsSelected" Value="False">
                    <Setter Property="????" Value="Visible"></Setter>
                </Trigger>
            </Style.Triggers>

Но я не знаю, как получить доступ к CloseButton из Trigger TabItem Style -> Я пытался TargetName="CloseButton", но это не работает ...

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Я бы установил триггер стиля на Button вместо TabItem и использовал бы привязку RelativeSource для получения значения TabItem.IsSelected

<Style x:Key="CloseButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Visibility" Value="Visible"></Setter>
    <Style.Triggers>
        <DataTrigger Property="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}" Value="True">
            <Setter Property="Visibility" Value="Visible"></Setter>
        </DataTrigger >
    </Style.Triggers>
</Style>
1 голос
/ 20 марта 2012
<Style TargetType="{x:Type TabItem}" x:Key="maintemplate">
    <Style.Resources>
        <DataTemplate x:Key="headertemplate" DataType="{x:Type TabItem}">
            <StackPanel Orientation="Horizontal">
                <StackPanel.Resources>
                    <local:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
                </StackPanel.Resources>
                <ContentPresenter Content="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem} }, Path=Header}"/>
                <Button Content="X" x:Name="CloseButton" Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TabItem}},Path=IsSelected,Converter={StaticResource BoolToVisibilityConverter}}">
                    <Button.LayoutTransform>
                        <ScaleTransform ScaleX="0.8" ScaleY="0.5"></ScaleTransform>
                    </Button.LayoutTransform>
                </Button>
            </StackPanel>
        </DataTemplate>
    </Style.Resources>
    <Setter Property="HeaderTemplate" Value="{StaticResource headertemplate}"></Setter>
</Style>

public class BoolToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var isVisible = value as bool?;
        if (isVisible == null || !isVisible.Value)
        {
            return Visibility.Collapsed;
        }
        return Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
...