0

選択した項目を追跡するメニューを作成したいので、入れ子になった ListBox を使用しています (セレクターのオプションがかなり限られているためです。メインの ListBox は水平に配置され、各 ListBoxItem には TextBlock と、別の ListBox を含む StackPanel が含まれています (この1つは垂直に表示されます)「MenuItems」を表示します(選択したアイテムも追跡する必要があります)。

    <ListBox DockPanel.Dock="Top" Grid.Column="0" ItemsSource="{Binding DashBoards}" 
                     IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding SelectedDashBoard}">

        <ListBox.Template>
            <ControlTemplate TargetType="{x:Type ListBox}">
                <DockPanel>
                    <ScrollViewer x:Name="scrollviewer" HorizontalScrollBarVisibility="Hidden" CanContentScroll="False">
                        <StackPanel IsItemsHost="True" Orientation="Horizontal" />
                    </ScrollViewer>
                </DockPanel>
            </ControlTemplate>
        </ListBox.Template>

        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Name}" />
                    <dx:DXExpander IsExpanded="{Binding IsSelected}">
                        <ListBox ItemsSource="{Binding Sections}" 
                     IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding SelectedSection}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Metadata.Name}" />
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </dx:DXExpander>
                </StackPanel> 
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

この ListBox を他のコントロールの上に表示することができたので、メニューのように見えます。

問題が発生しました...水平のListBoxでアイテムを選択すると、Expanderは正常に拡張されますが、ListBoxの高さが大きくなるため、他のすべてのアイテムも拡張されたように見えます。

ListBox の高さを変更せずに、選択したアイテムのみを展開するにはどうすればよいですか?

言い換えれば、垂直の ListBox の 1 つをその親コン​​テナー (別名、水平の ListBox) からオーバーフローさせるにはどうすればよいでしょうか?

すべてを再構築する必要があると思いますが、どのように始めればよいかわかりません。Canvas を使用するソリューションをいくつか見つけましたが、この場合は機能しないようです。

どんな助けも歓迎され、熱心に支持されます;-)

(注: 念のため、水平方向の ListBox でどの要素が選択されているか、また個々の垂直方向の ListBox でどの要素が選択されているかを知る必要があります。これは、選択を追跡する対応する ViewModel にバインドし、水平および垂直の ListBoxes は動的に入力されるため、XAML で定義する方法はありません)

4

1 に答える 1

2

選択したスタイルをデータ テンプレートから移動して、すべてのアイテムに適用しないようにすることができます。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="ListViewItem">
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Height" Value="90"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <ListView>
            <ListView.Items>
                <sys:String>a</sys:String>
                <sys:String>b</sys:String>
                <sys:String>c</sys:String>
                <sys:String>d</sys:String>
                <sys:String>e</sys:String>                
            </ListView.Items>
        </ListView>
    </Grid>
</Window>

編集:あなたが何をしたかを適切に読んだ後、私はあなたのエキスパンダークラスまたはあなたがバインドしているアイテムを持っていないので、私は Expander と MenuItem を使用していますが、これはリストビューを選択可能なアイテムを持つメニューとして使用する例を示しています、多分それはあなたの問題を解決するのに役立つでしょう、私はあなたのエキスパンダーコントロールが実際のエキスパンダーボタンを隠していると仮定しています。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView Height="16" VerticalAlignment="Top">
            <ListView.Resources>
                <Style TargetType="ListViewItem">
                    <Setter Property="Margin" Value="0,0,10,0"/>
                </Style>
            </ListView.Resources>
            <ListView.Template>
                <ControlTemplate TargetType="{x:Type ListBox}">
                    <StackPanel Background="LightGray" IsItemsHost="True" Orientation="Horizontal" />
                </ControlTemplate>
            </ListView.Template>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical"  ClipToBounds="False">
                        <TextBlock Text="{Binding Header}" />
                        <Canvas>
                            <Expander IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}">
                                <Expander.Style>
                                    <Style TargetType="{x:Type Expander}">
                                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                                        <Setter Property="Background" Value="Transparent"/>
                                        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                                        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
                                        <Setter Property="BorderBrush" Value="Transparent"/>
                                        <Setter Property="BorderThickness" Value="1"/>
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="{x:Type Expander}">
                                                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="3" SnapsToDevicePixels="true">
                                                        <DockPanel>

                                                            <ContentPresenter x:Name="ExpandSite" DockPanel.Dock="Bottom" Focusable="false" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Visibility="Collapsed" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                                                        </DockPanel>
                                                    </Border>
                                                    <ControlTemplate.Triggers>
                                                        <Trigger Property="IsExpanded" Value="true">
                                                            <Setter Property="Visibility" TargetName="ExpandSite" Value="Visible"/>
                                                        </Trigger>
                                                        <Trigger Property="ExpandDirection" Value="Right">
                                                            <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Right"/>
                                                        </Trigger>
                                                        <Trigger Property="ExpandDirection" Value="Up">
                                                            <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Top"/>
                                                        </Trigger>
                                                        <Trigger Property="ExpandDirection" Value="Left">
                                                            <Setter Property="DockPanel.Dock" TargetName="ExpandSite" Value="Left"/>
                                                        </Trigger>
                                                        <Trigger Property="IsEnabled" Value="false">
                                                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                                                        </Trigger>
                                                    </ControlTemplate.Triggers>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </Expander.Style>
                                <ListView ItemsSource="{Binding Items}" IsSynchronizedWithCurrentItem="True" />
                            </Expander>
                        </Canvas>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>

            <ListView.Items>
                <MenuItem Header="File">
                    <MenuItem.Items>
                        <MenuItem Header="Open" IsHitTestVisible="False"/>
                        <MenuItem Header="Exit"  IsHitTestVisible="False"/>
                    </MenuItem.Items>
                </MenuItem>
                <MenuItem Header="Edit">
                    <MenuItem.Items>
                        <MenuItem Header="Cut" IsHitTestVisible="False"/>
                        <MenuItem Header="Copy" IsHitTestVisible="False"/>
                        <MenuItem Header="Paste" IsHitTestVisible="False"/>
                    </MenuItem.Items>
                </MenuItem>
            </ListView.Items>

        </ListView>
    </Grid>
</Window>
于 2013-02-28T12:35:59.033 に答える