WPF CheckBox слева от TreeView - PullRequest
       9

WPF CheckBox слева от TreeView

1 голос
/ 23 марта 2010

Как вставить флажок слева от древовидного элемента (расширитель), чтобы это был тот же элемент.

Ответы [ 2 ]

1 голос
/ 23 марта 2010

Sergo, вот версия, использующая шаблон управления, и у нас есть флажки, размещенные в столбце 0 элемента. Они должны выровняться влево с TreeViewItem справа. «Волшебная» часть находится в стиле 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>
0 голосов
/ 23 марта 2010

Вы можете изменить заголовок вашего 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>

В зависимости от вашего сценария вы можете создать новый шаблон для переопределенияпо умолчанию ищите все TreeViewItems, если вы это сделаете, то извлекайте MSDN TreeViewItem Control Template пример:

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

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