Видимость текстового поля не меняется в заголовке вкладки WPF - PullRequest
1 голос
/ 02 сентября 2011

Я создал стиль для TabItem. Если дважды щелкнуть заголовок tabItem, появится текстовое поле, чтобы можно было редактировать текст заголовка.

Я хочу скрыть это текстовое поле, когда выбор вкладки изменяется или вкладка теряет фокус, поэтому я устанавливаю видимость в false, когда IsSelected имеет значение false или когда событие SelectionChanged вызывается, но оно НЕ работает.

<Trigger Property="IsSelected" Value="false">
    <Setter Property="Visibility" Value="{x:Static Visibility.Collapsed}" TargetName="tabHeaderEdit" />
    <Setter Property="Visibility" Value="{x:Static Visibility.Visible}" TargetName="tabHeaderPresenter" />
    <Setter TargetName="tabDockPanel" Property="Background" Value="#FFC9C7BA" />
</Trigger>

<EventTrigger RoutedEvent="Selector.SelectionChanged">
    <BeginStoryboard Storyboard="{StaticResource endHeaderEdit}"/>
</EventTrigger>

Вот полный XAML. Может кто-нибудь сказать мне, что не так с этим xaml?

<Window x:Class="WpfApplication1.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Classic" 
    xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
    xmlns:sys="clr-namespace:System;assembly=mscorlib" Title="Window1" Height="300" Width="300">
<Window.Resources>
    <Storyboard x:Key="startHeaderEdit">
        <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="tabHeaderEdit" Storyboard.TargetProperty="(UIElement.Visibility)">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
        </ObjectAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="tabHeaderPresenter" Storyboard.TargetProperty="(UIElement.Visibility)">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}" />
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="endHeaderEdit">
        <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="tabHeaderEdit" Storyboard.TargetProperty="(UIElement.Visibility)" >
            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}" />
        </ObjectAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="tabHeaderPresenter" Storyboard.TargetProperty="(UIElement.Visibility)">
            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
    <LinearGradientBrush x:Key="LightBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF" Offset="0.0"/>
                <GradientStop Color="#EEE" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>
    <SolidColorBrush x:Key="SolidBorderBrush" Color="#888" />
    <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#FFF" />
    <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE" />
    <SolidColorBrush x:Key="DisabledBorderBrush" Color="#AAA" />
    <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />
    <Style x:Key="{x:Type TabItem}" TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">           
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TabItem}">                        
                    <theme:ClassicBorderDecorator Name="ClassicBorder" SnapsToDevicePixels="true" BorderStyle="TabTop" Background="{TemplateBinding Background}" BorderBrush="{x:Static theme:ClassicBorderDecorator.ClassicBorderBrush}" BorderThickness="2">
                        <DockPanel x:Name="tabDockPanel">
                            <Button x:Name="tabCloseButton" Content="X" Cursor="Hand" DockPanel.Dock="Right" Focusable="False" FontFamily="Courier" FontSize="9" FontWeight="Bold" Margin="5,2,3,2" Padding="0" VerticalContentAlignment="Bottom" Width="16" Height="16"/>
                            <TextBox x:Name="tabHeaderEdit" DockPanel.Dock="Left" Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Header}" Visibility="Collapsed">                                    
                            </TextBox>
                            <ContentPresenter x:Name="tabHeaderPresenter" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header" Margin="{TemplateBinding Padding}" RecognizesAccessKey="true" HorizontalAlignment="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" VerticalAlignment="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
                        </DockPanel>
                    </theme:ClassicBorderDecorator>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Panel.ZIndex" Value="1" />
                        </Trigger>
                        <Trigger Property="IsSelected" Value="false">
                            <Setter Property="Visibility" Value="{x:Static Visibility.Collapsed}" TargetName="tabHeaderEdit" />
                            <Setter Property="Visibility" Value="{x:Static Visibility.Visible}" TargetName="tabHeaderPresenter" />
                            <Setter TargetName="tabDockPanel" Property="Background" Value="#FFC9C7BA" />
                        </Trigger>
                        <EventTrigger RoutedEvent="Control.MouseDoubleClick">
                            <BeginStoryboard Storyboard="{StaticResource startHeaderEdit}"/>
                        </EventTrigger>
                        <EventTrigger RoutedEvent="Selector.SelectionChanged">
                            <BeginStoryboard Storyboard="{StaticResource endHeaderEdit}"/>
                        </EventTrigger>
                        <!--<EventTrigger RoutedEvent="Mouse.MouseLeave">
                            <BeginStoryboard Storyboard="{StaticResource endHeaderEdit}"/>
                        </EventTrigger>-->
                        <Trigger Property="TabStripPlacement" Value="Bottom">
                            <Setter TargetName="ClassicBorder" Property="BorderStyle" Value="TabBottom" />
                        </Trigger>
                        <Trigger Property="TabStripPlacement" Value="Left">
                            <Setter TargetName="ClassicBorder" Property="BorderStyle" Value="TabLeft" />
                        </Trigger>
                        <Trigger Property="TabStripPlacement" Value="Right">
                            <Setter TargetName="ClassicBorder" Property="BorderStyle" Value="TabRight" />
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true" />
                                <Condition Property="TabStripPlacement" Value="Top"  />
                            </MultiTrigger.Conditions>
                            <Setter Property="Margin" Value="-2" />
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true" />
                                <Condition Property="TabStripPlacement" Value="Bottom" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Margin" Value="-2" />
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true" />
                                <Condition Property="TabStripPlacement" Value="Left" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Padding" Value="11,2,14,2" />
                            <Setter Property="Margin" Value="-2" />
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true" />
                                <Condition Property="TabStripPlacement" Value="Right" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Padding" Value="14,2,11,2" />
                            <Setter Property="Margin" Value="-2" />
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Value="{DynamicResource {x:Static SystemColors.GrayTextBrush}}" Property="Foreground" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>        
</Window.Resources>
<TabControl Name="tabControlView" Margin="4" BorderThickness="1" BorderBrush="Black">
    <TabControl.Items>
        <TabItem Header="Header 1" Content="Content 1" HorizontalAlignment="Left" VerticalAlignment="Top"></TabItem>
        <TabItem Header="Header 2" Content="Content 2"  HorizontalAlignment="Left" VerticalAlignment="Top"></TabItem>
        <TabItem Header="Header 3" Content="Content 3"  HorizontalAlignment="Left" VerticalAlignment="Top"></TabItem>
    </TabControl.Items>
</TabControl>

1 Ответ

0 голосов
/ 02 сентября 2011

Как насчет остановки редактирования на LostFocus:

<EventTrigger SourceName="tabHeaderEdit" RoutedEvent="UIElement.LostFocus">
    <BeginStoryboard Storyboard="{StaticResource endHeaderEdit}"/>
</EventTrigger>

(По крайней мере, это работает, и, вероятно, это больше соответствует тому, как это обычно делается)

Edit: Триггер SelectionChanged никогда не срабатывает, так как событие принадлежит TabControl, а не TabItem, который является шаблонным, далее Setters не может изменить значения, так как они были анимированы раскадровки. это будет работать:

<Trigger Property="IsSelected" Value="false">
    <Trigger.EnterActions>
        <StopStoryboard BeginStoryboardName="start"/>
        <BeginStoryboard Name="end" Storyboard="{StaticResource endHeaderEdit}"/>
    </Trigger.EnterActions>
    <Setter TargetName="tabDockPanel" Property="Background" Value="#FFC9C7BA" />
</Trigger>
<EventTrigger RoutedEvent="Control.MouseDoubleClick">
    <BeginStoryboard Name="start" Storyboard="{StaticResource startHeaderEdit}"/>
</EventTrigger>

Я бы по-прежнему рекомендовал использовать первый метод, хотя это немного раздражает, если TextBox остается даже после щелчка, оставаясь на той же вкладке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...