在网上有很多人在问如何实现ComboBox中嵌套一个TreeView。在查了一些资料后,综合大家的意见。我做了一个简单的实例。
可以从这里下载:
主要的解决办法:
ComboBox主要有两部分组成,一个ToggleButton,一个Popup。通过重新设置一个Popup,可以很容易的添加一个TreeView。
另外,需要将选择的Node表示在ToggleButton中,也需要重新定义一个ToggleButton,并奖显示的内容与TreeView.SelectedItem.Header帮顶。
如果需要有编辑功能,需要另外再加一个TextBox在ToggleButton上。下面是主要的ComboBox Style。具体的内容可以从这里下载
1
<Style x:Key="{x:Type ComboBox}" TargetType="ComboBox">2
<Setter Property="SnapsToDevicePixels" Value="true"/>3
<Setter Property="OverridesDefaultStyle" Value="true"/>4
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>5
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>6
<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>7
<Setter Property="MinWidth" Value="120"/>8
<Setter Property="MinHeight" Value="20"/>9
<Setter Property="Template">10
<Setter.Value>11
<ControlTemplate TargetType="ComboBox">12
<Grid>13
<ToggleButton Name="ToggleButton" 14
Template="{StaticResource ComboBoxToggleButton}" 15
Grid.Column="2" 16
Focusable="false"17
IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"18
ClickMode="Press">19
</ToggleButton>20
<ContentPresenter Name="ContentSite"21
IsHitTestVisible="False" 22
Content="{Binding ElementName=tv, Mode=OneWay, Path=SelectedItem, Converter={StaticResource TreeViewSelectionConverter}}"23
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"24
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"25
Margin="3,3,23,3"26
VerticalAlignment="Center"27
HorizontalAlignment="Left" />28
<TextBox x:Name="PART_EditableTextBox"29
Style="{x:Null}" 30
Text="{Binding ElementName=tv, Mode=OneWay, Path=SelectedItem.Header}"31
Template="{StaticResource ComboBoxTextBox}" 32
HorizontalAlignment="Left" 33
VerticalAlignment="Center" 34
Margin="3,3,23,3"35
Focusable="True" 36
Background="Transparent"37
Visibility="Hidden"38
IsReadOnly="{TemplateBinding IsReadOnly}"/>39
<Popup Name="Popup"40
Placement="Bottom"41
IsOpen="{TemplateBinding IsDropDownOpen}"42
AllowsTransparency="True" 43
Focusable="False"44
PopupAnimation="Slide">45
<Grid Name="DropDown"46
SnapsToDevicePixels="True" 47
MinWidth="{TemplateBinding ActualWidth}"48
MaxHeight="{TemplateBinding MaxDropDownHeight}">49
<Border x:Name="DropDownBorder"50
Background="{StaticResource WindowBackgroundBrush}"51
BorderThickness="1"52
BorderBrush="{StaticResource SolidBorderBrush}">53
<ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">54
<TreeView Name="tv">55
<TreeViewItem Header="Employee1">56
<TreeViewItem Header="Jesper"/>57
<TreeViewItem Header="Aaberg"/>58
<TreeViewItem Header="12345"/>59
</TreeViewItem>60
<TreeViewItem Header="Employee2">61
<TreeViewItem Header="Dominik"/>62
<TreeViewItem Header="Paiha"/>63
<TreeViewItem Header="98765"/>64
</TreeViewItem>65
</TreeView>66
</ScrollViewer>67
</Border>68

69
</Grid>70
</Popup>71
</Grid>72
<ControlTemplate.Triggers>73
<Trigger Property="HasItems" Value="false">74
<Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>75
</Trigger>76
<Trigger Property="IsEnabled" Value="false">77
<Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>78
</Trigger>79
<Trigger Property="IsGrouping" Value="true">80
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>81
</Trigger>82
<Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">83
<Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>84
<Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>85
</Trigger>86
<Trigger Property="IsEditable" Value="true">87
<Setter Property="IsTabStop" Value="false"/>88
<Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/>89
<Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/>90
</Trigger>91
</ControlTemplate.Triggers>92
</ControlTemplate>93
</Setter.Value>94
</Setter>95
</Style>
浙公网安备 33010602011771号