WPF自定义“工具箱”选择器控件

时间:2011-08-11 09:26:41

标签: c# .net wpf

我正在尝试创建一个自定义控件,其行为有点像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中布置它们的顺序相同,且当前所选项目缺失。

由于

2 个答案:

答案 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创建项目的预览来解决问题,而无需在可视化树中移动它。