TreeView模仿疯狂

时间:2011-11-06 17:50:13

标签: .net wpf xaml c#-4.0

我有一些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上使用简单的Trigger并设置border / background / foreground ..没有任何显示任何更改。

我已经用Google搜索了,到目前为止我发现的任何内容都是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 个答案:

答案 0 :(得分:2)

模板是“XAML的巨大丑陋”,这就是现实,你无能为力。

答案 1 :(得分:1)

最短路径(并不是那么漂亮):用StackPanel包裹带有边框的Trigger并在<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> 中更改其背景。

XAML:

ToggleButton

注意: - 将“HotPink”更改为所需的颜色

注意2: - 对于TreeViewItem功能,您最好添加<ToggleButton IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/> ,以允许用户展开\折叠项目。它的最小工作(在stackPanel中的某个地方):

TabItem

P.S。 - 等到你在Luna主题中看到{{1}}的模板....

答案 2 :(得分:0)

要清理您的网页,您可以使用全局“合并资源字典”,并将模板填入其中。

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