TreeView左侧的WPF CheckBox

时间:2010-03-23 11:01:58

标签: wpf c#-3.0

如何在treeviewitem(扩展器)的左侧插入复选框,因此它是相同的项目。

2 个答案:

答案 0 :(得分:1)

Sergo,这是一个使用控制模板的版本,我们将复选框放在项目的第0列。它们应该与左边的TreeViewItem对齐。 'magic'是CheckboxTreeItem样式,我们在其中添加一个WrapPanel并将其放在Grid.Column ='0'中。

<Window
    x:Class="TreeViewHeaderTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1"
    Height="300"
    Width="300">
    <Window.Resources>
        <SolidColorBrush
            x:Key="GlyphBrush"
            Color="#444" />
        <Style
            x:Key="ExpandCollapseToggleStyle"
            TargetType="ToggleButton">
            <Setter
                Property="Focusable"
                Value="False" />
            <Setter
                Property="Template">
                <Setter.Value>
                    <ControlTemplate
                        TargetType="ToggleButton">
                        <WrapPanel
                            Background="Transparent">
                            <Path
                                x:Name="ExpandPath"
                                HorizontalAlignment="Left"
                                VerticalAlignment="Center"
                                Margin="1,1,1,1"
                                Fill="{StaticResource GlyphBrush}"
                                Data="M 4 0 L 8 4 L 4 8 Z" />
                        </WrapPanel>
                        <ControlTemplate.Triggers>
                            <Trigger
                                Property="IsChecked"
                                Value="True">
                                <Setter
                                    Property="Data"
                                    TargetName="ExpandPath"
                                    Value="M 0 4 L 8 4 L 4 8 Z" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style
            x:Key="TreeViewItemFocusVisual">
            <Setter
                Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border>
                            <Rectangle
                                Margin="0,0,0,0"
                                StrokeThickness="5"
                                Stroke="Black"
                                StrokeDashArray="1 2"
                                Opacity="0" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style
            x:Key="CheckboxTreeItem"
            TargetType="{x:Type TreeViewItem}">
            <Setter
                Property="IsExpanded"
                Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter
                Property="IsSelected"
                Value="{Binding IsSelected, Mode=TwoWay}" />
            <Setter
                Property="Background"
                Value="Transparent" />
            <Setter
                Property="HorizontalContentAlignment"
                Value="{Binding Path=HorizontalContentAlignment,
                RelativeSource={RelativeSource 
                AncestorType={x:Type ItemsControl}}}" />
            <Setter
                Property="VerticalContentAlignment"
                Value="{Binding Path=VerticalContentAlignment,
                RelativeSource={RelativeSource 
                AncestorType={x:Type ItemsControl}}}" />
            <Setter
                Property="Padding"
                Value="1,0,0,0" />
            <Setter
                Property="Foreground"
                Value="{StaticResource {x:Static 
                SystemColors.ControlTextBrushKey}}" />
            <Setter
                Property="FocusVisualStyle"
                Value="{StaticResource TreeViewItemFocusVisual}" />
            <Setter
                Property="Template">
                <Setter.Value>
                    <ControlTemplate
                        TargetType="{x:Type TreeViewItem}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition
                                    MinWidth="19"
                                    Width="Auto" />
                                <ColumnDefinition
                                    Width="Auto" />
                                <ColumnDefinition
                                    Width="*" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition
                                    Height="Auto" />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <WrapPanel
                                Grid.Column='0'>
                                <CheckBox />
                                <ToggleButton
                                    x:Name="Expander"
                                    Style="{StaticResource 
                                    ExpandCollapseToggleStyle}"
                                    IsChecked="{Binding Path=IsExpanded,
                                      RelativeSource={RelativeSource 
                                    TemplatedParent}}"
                                    ClickMode="Press" />
                            </WrapPanel>
                            <Border
                                Name="Bd"
                                Grid.Column="1"
                                Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding 
                                BorderThickness}"
                                Padding="{TemplateBinding Padding}">
                                <ContentPresenter
                                    x:Name="PART_Header"
                                    ContentSource="Header"
                                    HorizontalAlignment="{TemplateBinding 
                                    HorizontalContentAlignment}" />
                            </Border>
                            <ItemsPresenter
                                x:Name="ItemsHost"
                                Grid.Row="1"
                                Grid.Column="1"
                                Grid.ColumnSpan="2" />
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger
                                Property="IsExpanded"
                                Value="false">
                                <Setter
                                    TargetName="ItemsHost"
                                    Property="Visibility"
                                    Value="Collapsed" />
                            </Trigger>
                            <Trigger
                                Property="HasItems"
                                Value="false">
                                <Setter
                                    TargetName="Expander"
                                    Property="Visibility"
                                    Value="Hidden" />
                            </Trigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition
                                        Property="HasHeader"
                                        Value="false" />
                                    <Condition
                                        Property="Width"
                                        Value="Auto" />
                                </MultiTrigger.Conditions>
                                <Setter
                                    TargetName="PART_Header"
                                    Property="MinWidth"
                                    Value="75" />
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition
                                        Property="HasHeader"
                                        Value="false" />
                                    <Condition
                                        Property="Height"
                                        Value="Auto" />
                                </MultiTrigger.Conditions>
                                <Setter
                                    TargetName="PART_Header"
                                    Property="MinHeight"
                                    Value="19" />
                            </MultiTrigger>
                            <Trigger
                                Property="IsSelected"
                                Value="true">
                                <Setter
                                    TargetName="Bd"
                                    Property="Background"
                                    Value="AliceBlue" />
                            </Trigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition
                                        Property="IsSelected"
                                        Value="true" />
                                    <Condition
                                        Property="IsSelectionActive"
                                        Value="false" />
                                </MultiTrigger.Conditions>
                                <Setter
                                    TargetName="Bd"
                                    Property="Background"
                                    Value="{StaticResource {x:Static 
                                    SystemColors.ControlBrushKey}}" />
                                <Setter
                                    Property="Foreground"
                                    Value="{StaticResource {x:Static 
                                    SystemColors.ControlTextBrushKey}}" />
                            </MultiTrigger>
                            <Trigger
                                Property="IsEnabled"
                                Value="false">
                                <Setter
                                    Property="Foreground"
                                    Value="{StaticResource {x:Static 
                                    SystemColors.GrayTextBrushKey}}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <TreeView>
        <TreeViewItem
            Style='{StaticResource CheckboxTreeItem}'
            Header='Item'
            IsExpanded='True'>
            <TreeViewItem
                Style='{StaticResource CheckboxTreeItem}'
                Header='SubItem 1' />
            <TreeViewItem
                Style='{StaticResource CheckboxTreeItem}'
                Header='SubItem 2'>
                <TreeViewItem
                    Style='{StaticResource CheckboxTreeItem}'
                    Header='SubItem a' />
                <TreeViewItem
                    Style='{StaticResource CheckboxTreeItem}'
                    Header='SubItem b' />
            </TreeViewItem>
        </TreeViewItem>
    </TreeView>
</Window>

答案 1 :(得分:0)

您可以修改TreeViewItem的标题以在左侧添加复选框。这是一个简单的例子,让你开始,这个xaml只是在左边添加一个复选框,在右边添加一个TextBlock。

<TreeView>
        <TreeViewItem>
            <TreeViewItem.Header>
                <WrapPanel>
                    <CheckBox />
                    <TextBlock
                        Margin='5,0'
                        Text='Item' />
                </WrapPanel>
            </TreeViewItem.Header>
            <TreeViewItem>
                <TreeViewItem.Header>
                    <WrapPanel>
                        <CheckBox />
                        <TextBlock
                            Margin='5,0'
                            Text='SubItem' />
                    </WrapPanel>
                </TreeViewItem.Header>
            </TreeViewItem>
        </TreeViewItem>
    </TreeView>

根据您的情况,您可能需要创建一个全新模板来覆盖所有TreeViewItem的默认外观(如果这样),然后签出MSDN TreeViewItem控件模板示例:

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