treeview控件(动态数据绑定+整行选择)(WPF)(二)

上一篇中介绍了动态绑定数据库的方法,本篇中将会介绍整行选择的方法

<local:IndentConverter x:Key="ConverterLoginMarginLeft"/>


        <!--treeview控件的样式-->



        <PathGeometry  x:Key="TreeArrow" Figures="M0,0 L0,6 L6,0 Z"/><!--折叠按钮的图片-->

<!--折叠用按钮的风格-->
        <Style x:Key="ExpandCollapseToggleStyle" TargetType="{x:Type ToggleButton}">
            <Setter Property="Focusable" Value="False"/>
            <Setter Property="Width" Value="16"/>
            <Setter Property="Height" Value="16"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border Background="Transparent" Height="16" Width="16" Padding="5,5,5,5">
                            <Path x:Name="ExpandPath" Data="{StaticResource TreeArrow}" Fill="#FF2C81CC" Stroke="#FF2C81CC">
                                <Path.RenderTransform>
                                    <RotateTransform Angle="135" CenterX="3" CenterY="3"/>
                                </Path.RenderTransform>
                            </Path>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Stroke" TargetName="ExpandPath" Value="#FF1BBBFA"/>
                                <Setter Property="Fill" TargetName="ExpandPath"  Value="Transparent"/>
                            </Trigger>
                            <Trigger Property="IsChecked" Value="true">
                                <Setter Property="RenderTransform" TargetName="ExpandPath">
                                    <Setter.Value>
                                        <RotateTransform Angle="225" CenterY="3" CenterX="3"/>
                                    </Setter.Value>
                                </Setter>
                                <Setter Property="Fill" TargetName="ExpandPath" Value="#FF2C81CC"/>
                                <Setter Property="Stroke" TargetName="ExpandPath" Value="#FF2C81CC"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

<!--树节点的风格-->
        <Style x:Key="TreeViewItemStyle" TargetType="{x:Type TreeViewItem}">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="HorizontalContentAlignment"
                    Value="{Binding HorizontalContentAlignment,RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="VerticalContentAlignment" 
                    Value="{Binding VerticalContentAlignment,RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="Padding" Value="1,0,0,0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TreeViewItem}">
                        <StackPanel>
                            <Border x:Name="Bd" CornerRadius="2" BorderBrush="{TemplateBinding BorderBrush}" 
                                    BorderThickness="{TemplateBinding BorderThickness}" 
                                    Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" 
                                    SnapsToDevicePixels="True">
                                <Grid x:Name="grid" Background="{x:Null}">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="auto"/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Rectangle x:Name="Hover" Grid.ColumnSpan="2" 
                                               Stroke="#FFfee69e" StrokeThickness="1" 
                                               HorizontalAlignment="Stretch" RadiusX="4" RadiusY="4" 
                                               IsHitTestVisible="False" Opacity="0">
                                        <Rectangle.Fill>
                                            <LinearGradientBrush StartPoint=" .5,0" EndPoint=".5,1">
                                                <GradientStop Offset="0" Color="#FFfff2ca"/>
                                                <GradientStop Offset=" 1" Color="#FFfee69e"/>
                                            </LinearGradientBrush>
                                        </Rectangle.Fill>
                                    </Rectangle>


                                    <Rectangle x:Name="Selection" Grid.ColumnSpan="2" 
                                               Stroke="#FFd8f0ff"  HorizontalAlignment="Stretch"
                                               RadiusX="4" RadiusY="4" IsHitTestVisible="False" Opacity="0">
                                        <Rectangle.Fill>
                                            <LinearGradientBrush >
                                                <GradientStop Offset="0" Color="#ffe5f4ff"/>
                                                <GradientStop Offset=" 1" Color="#FFd8f0ff"/>
                                            </LinearGradientBrush>
                                        </Rectangle.Fill>
                                    </Rectangle>
                                    
                                    <ToggleButton x:Name="Expander" ClickMode="Press" 
                                                  IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
                                                  Style="{StaticResource ExpandCollapseToggleStyle}"
                                                  HorizontalAlignment="Left" VerticalAlignment="Top" Margin=" 0" />
                                    <ContentPresenter x:Name="PART_Header" ContentSource="Header" Grid.Column="1"
                                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                      SnapsToDevicePixels="{Binding SnapsToDevicePixels}"/>
                                </Grid>
                            </Border>
                            <ItemsPresenter x:Name="ItemHost"/>
                        </StackPanel>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsExpanded" Value="false">
                                <Setter Property="Visibility" TargetName="ItemHost" Value="Collapsed"/>
                            </Trigger>
                            <Trigger Property="HasItems" Value="false">
                                <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
                            </Trigger>
                            <Trigger Property="IsSelected" Value="false">
                                <Setter Property="Opacity" TargetName="Selection" Value="1"/>
                            </Trigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="true"/>
                                    <Condition Property="IsExpanded" Value=" false"/>
                                    <Condition Property="IsSelected" Value=" true"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Opacity" TargetName="Hover" Value="1"/>
                            </MultiTrigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{DynamicResource ResourceKey{x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>                 
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="VirtualizingStackPanel.IsVirtualizing" Value="true">
                    <Setter Property="ItemsPanel">
                        <Setter.Value>
                            <ItemsPanelTemplate>
                                <VirtualizingStackPanel/>
                            </ItemsPanelTemplate>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>

最上面一行使用的IndentConverter是一个类,计算文本位置

using System.Windows.Data;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows;

public class IndentConverter:IValueConverter
    {
        public double Indent { get; set; }
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            double colunwidth = 10;
            double left = 0.0;


            UIElement element = value as TreeViewItem;
            while(element.GetType()!=typeof(TreeView))
            {
                element = (UIElement)VisualTreeHelper.GetParent(element);
                if (element.GetType() == typeof(TreeViewItem))
                    left += colunwidth;
            }
            return new Thickness(left, 0, 0, 0);
            /*
            var item = value as TreeViewItem;
            if (item == null)
            {
                return new Thickness(0);
            }
            return new Thickness(Indent * item.GetDepth(), 0, 0, 0);*/
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值