TreeView Templating безумие - PullRequest
       0

TreeView Templating безумие

0 голосов
/ 06 ноября 2011

У меня есть несколько синхронизированных экземпляров TreeView ..

это работает довольно хорошо, и я привязываю некоторые свойства к ViewModel.

<Style x:Key="FlattenedTreeViewItem" TargetType="{x:Type TreeViewItem}">

    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="IsExpanded" Value="{Binding IsExpanded}" />
    <Setter Property="IsSelected" Value="{Binding IsSelected}" />

По той или иной причине я решил переопределить шаблон TreeViewItem.

привязки стертых свойств выше

Все, что я хочу сделать, это вернуть выбор по умолчанию обратно в TreeViewItem, но, похоже, ничего не работает. Я попытался использовать простой триггер на IsSelected и установить границы / фон / передний план ... ничего не показывает никаких изменений.

Я погуглил, и все, что я нашел до сих пор, было страницей XAML просто для того, чтобы установить выбранный стиль ?? Нет ли простого способа вернуть его обратно в шаблон?

то же самое относится к IsExapnded, я должен использовать это:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="ExpansionStates">
        <VisualState x:Name="Expanded">
            <Storyboard>
                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="ItemsHost">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
        </VisualState>
        <VisualState x:Name="Collapsed" />
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

кажется чрезмерным, но по крайней мере этот работает.

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

вот мой полный шаблон:

<Setter Property="Template">
        <Setter.Value>

            <ControlTemplate TargetType="TreeViewItem">

                <StackPanel>
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="ExpansionStates">
                        <VisualState x:Name="Expanded">
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="ItemsHost">
                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Collapsed" />
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                    <ContentPresenter ContentSource="Header" />
                    <ItemsPresenter Name="ItemsHost" Visibility="Collapsed" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

Ответы [ 3 ]

2 голосов
/ 06 ноября 2011

Шаблоны "огромные уродливые куски XAML" , это реальность, с этим ничего нельзя поделать.

1 голос
/ 07 ноября 2011

Самый короткий (и не очень красивый) маршрут: оберните StackPanel рамкой и измените его фон в Trigger.

XAML:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="TreeViewItem">
            <Border x:Name="Bd" Background="Transparent">
            <StackPanel>
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="ExpansionStates">
                    <VisualState x:Name="Expanded">
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="ItemsHost">
                                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Collapsed" />
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
                <ContentPresenter ContentSource="Header" />
                <ItemsPresenter Name="ItemsHost" Visibility="Collapsed" />
            </StackPanel>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter TargetName="Bd" Property="Background" Value="HotPink"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>

ПРИМЕЧАНИЕ: - Измените «HotPink» на желаемый цвет

ПРИМЕЧАНИЕ 2. - Для функциональности TreeViewItem лучше добавить ToggleButton, который позволит пользователю развернуть \ свернуть элемент.Минимум, чтобы он работал (где-то в stackPanel):

<ToggleButton IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/>

PS - подождите, пока вы не увидите шаблон для TabItem в теме Luna ....

0 голосов
/ 07 ноября 2011

Для очистки вашей страницы вы можете использовать глобальный "словарь объединенных ресурсов" и заполнить там свой шаблон.

http://msdn.microsoft.com/en-us/library/aa350178.aspx

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