我正在尝试创建一个自定义控件,其行为有点像Expression Blend工具箱中的“行”之一。
当关闭时,它会显示其中的第一个项目,当用户将鼠标按住它一秒左右时,它会“展开”以显示弹出中的其他项目,不包括项目当前选择的(点击的项目仍然可见,但未与其他项目分组)。
我设法创建一个继承自ContentControl
的控件显示一个项目,然后在展开时显示其他项目,但是当点击一个项目时,首先显示的项目不会改变。
模板如下:
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<ContentPresenter Content="{TemplateBinding MainItem}" /> // The item that is seen even when not expanded
<Popup Name="Popup" Placement="Right" IsOpen="{TemplateBinding IsExpanded}" AllowsTransparency="True" Focusable="False" PopupAnimation="Fade">
<Border Name="SubmenuBorder" SnapsToDevicePixels="True" BorderThickness="0" >
<StackPanel Orientation="Horizontal" IsItemsHost="True" /> // The items only seen when expanded
</Border>
</Popup>
</Grid>
目前,我必须在XAML中手动设置MainItem
,并且它不是Items
的{{1}}属性的成员。
有没有办法实现此功能,其中所有项目都是ContentControl
集合的一部分,并且在设置Items
属性或某些内容时自动不显示,然后显示当前{在这种情况下会显示{1}}吗?
我尝试将其更改为IsSelected
并使用MainItem
上的过滤器来实现此目的,并将第一个Selector
绑定到Items
,但似乎没有工作。
如果可能,仅在展开控件时可见的项目顺序应与在XAML中布置它们的顺序相同,且当前所选项目缺失。
由于
答案 0 :(得分:0)
尝试使用ItemContainerStyle将所选项目的可见性设置为“隐藏”。你需要一个BoolToVisibilityConverter(你可以轻松地编写一个或从WPFToolkit中获取一个)来获得正确的值
<ContentPresenter Content="{Binding ElementName=selector, Path=SelectedItem}" />
<ComboBox x:Name="selector">
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="Visibility" Value="{Binding Path=IsSelected, Converter={StaticResource boolToVisibilityConverter}}" />
</Style>
</ComboBox.ItemContainerStyle>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding SomeProperty}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>ComboBoxItem
答案 1 :(得分:0)
我设法通过使用VisualBrush
创建项目的预览来解决问题,而无需在可视化树中移动它。