C# 用于显示复杂用户控件集合的ListBox控件不';水平滚动

C# 用于显示复杂用户控件集合的ListBox控件不';水平滚动,c#,wpf,listbox,C#,Wpf,Listbox,我已经和ListBox争论这个问题很久了。我有一个用于显示股票期权链的MVVM应用程序 OptionChainViewModel创建每个单独的链-每个可用的过期期对应一个链 然后我尝试用ListBox显示这些“链”,ListBox有一个ItemsPanelTemplate,其中有一个StackPanel 虽然我可以让水平滚动条显示,但它不是活动的,我无法让内容水平滚动。我尝试在StackPanel和ListBox本身上设置MaxWidth,但都没有效果。我还将选项ViewModel对象上的Max

我已经和ListBox争论这个问题很久了。我有一个用于显示股票期权链的MVVM应用程序

OptionChainViewModel创建每个单独的链-每个可用的过期期对应一个链

然后我尝试用ListBox显示这些“链”,ListBox有一个ItemsPanelTemplate,其中有一个StackPanel

虽然我可以让水平滚动条显示,但它不是活动的,我无法让内容水平滚动。我尝试在StackPanel和ListBox本身上设置MaxWidth,但都没有效果。我还将选项ViewModel对象上的MaxWidth和Width设置为无效

我查看了可视化树,发现scrollviewer就在ListBoxItems之前,它的MaxWidth和MaxHeight设置为“infinity”,因此我在viewmodel上插入了一个方法,当我单击视图中的按钮时会调用该方法。该方法查找scrollviewer并设置scrollviewer的MaxWidth和MaxHeight值……但即使这样也不会导致水平滚动条工作

                        <ListBox Name="lbAllOptions"
                                 Width="600"
                                 MaxHeight="400"
                                 MaxWidth="500"
                                 IsSynchronizedWithCurrentItem="True"
                                 ScrollViewer.CanContentScroll="True"
                                 ScrollViewer.HorizontalScrollBarVisibility="Visible"
                                 ScrollViewer.VerticalScrollBarVisibility="Hidden"
                                 ItemsSource="{Binding AllChains}">
                            <ListBox.ItemsPanel>
                                <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
            <!-- <pnls:CustomPanel  MaxWidth="500" MaxHeight="400"/>-->
            </ItemsPanelTemplate>
                            </ListBox.ItemsPanel>
                        </ListBox>

每个选项链项目的相关代码为:

<DockPanel>
    <GroupBox MaxWidth="500"
              HorizontalAlignment="Left">
        <GroupBox.HeaderTemplate>
            <DataTemplate>
                <StackPanel x:Name="stack"
                            Orientation="Horizontal">
                    <TextBlock Text="{Binding Source={x:Reference tblockDName}, Path=Text}"
                               DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}}" />
                </StackPanel>
            </DataTemplate>
        </GroupBox.HeaderTemplate>
        <Grid DockPanel.Dock="Bottom"
              Margin="0,2,4,2">
            <StackPanel Grid.Row="0"
                        Grid.Column="1"
                        MaxHeight="300"
                        MaxWidth="400"
                        Orientation="Vertical">
                <TextBlock x:Name="tblockDName"
                           Text="{Binding Path=DisplayName}"
                           Visibility="Collapsed" />
                <Label Content="Calls"
                       HorizontalAlignment="Left"
                       Name="lblCallOptionChains"
                       VerticalAlignment="Top" />
                <DataGrid   MinHeight="200"
                            MinWidth="200"
                            MaxWidth="500"

                            HorizontalAlignment="Left"
                            AutoGenerateColumns="False"
                            EnableRowVirtualization="True"
                            AlternatingRowBackground="LightGray"
                            SelectionUnit="FullRow"
                            Name="dgridCallOptionChain"
                            IsSynchronizedWithCurrentItem="True"
                            ItemsSource="{Binding _CallOptionList}"
                            SelectedItem="{Binding Path=SelectedOption, Mode=TwoWay}"
                            VerticalAlignment="Stretch"
                            HorizontalScrollBarVisibility="Visible"
                            VerticalScrollBarVisibility="Visible"
                            MaxHeight="200"
                            IsManipulationEnabled="True">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="PreviewKeyDown">
                            <ei:CallMethodAction TargetObject="{Binding}"
                                                 MethodName="SampleKeyDownEventHandler" />
                        </i:EventTrigger>
                        <i:EventTrigger EventName="PreviewTextInput">
                            <ei:CallMethodAction TargetObject="{Binding}"
                                                 MethodName="SampleTextInputEventHandler" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Symbol"
                                            Binding="{Binding OCSymbol}" />
                        <DataGridTextColumn Header="Strike"
                                            Binding="{Binding OCStrike}" />
                        <DataGridTextColumn  Header="Mid"
                                             Binding="{Binding OCMid}" />
                        <DataGridTextColumn Header="Interest"
                                            Binding="{Binding OCInterest}" />
                        <DataGridTextColumn Header="Model"
                                            Binding="{Binding OCModel}" />
                        <DataGridTextColumn Header="Position"
                                            Binding="{Binding OCPosition}" />
                    </DataGrid.Columns>
                </DataGrid>
                <Label Content="Puts"
                       HorizontalAlignment="Left"
                       Name="lblPutOptionChains"
                       VerticalAlignment="Top" />
                <DataGrid   MinHeight="200"
                            MinWidth="200"
                            MaxWidth="500"

                            HorizontalAlignment="Left"
                            AutoGenerateColumns="False"
                            EnableRowVirtualization="True"
                            AlternatingRowBackground="LightGray"
                            SelectionUnit="FullRow"
                            Name="dgridPutOptionChain"
                            IsSynchronizedWithCurrentItem="True"
                            ItemsSource="{Binding _PutOptionList}"
                            SelectedItem="{Binding Path=SelectedOption, Mode=TwoWay}"
                            VerticalAlignment="Stretch"
                            HorizontalScrollBarVisibility="Visible"
                            VerticalScrollBarVisibility="Visible"
                            MaxHeight="200"
                            IsManipulationEnabled="True">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="PreviewKeyDown">
                            <ei:CallMethodAction TargetObject="{Binding}"
                                                 MethodName="SampleKeyDownEventHandler" />
                        </i:EventTrigger>
                        <i:EventTrigger EventName="PreviewTextInput">
                            <ei:CallMethodAction TargetObject="{Binding}"
                                                 MethodName="SampleTextInputEventHandler" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>

                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Symbol"
                                            Binding="{Binding OCSymbol}" />
                        <DataGridTextColumn Header="Strike"
                                            Binding="{Binding OCStrike}" />
                        <DataGridTextColumn  Header="Mid"
                                             Binding="{Binding OCMid}" />
                        <DataGridTextColumn Header="Interest"
                                            Binding="{Binding OCInterest}" />
                        <DataGridTextColumn Header="Model"
                                            Binding="{Binding OCModel}" />
                        <DataGridTextColumn Header="Position"
                                            Binding="{Binding OCPosition}" />
                    </DataGrid.Columns>
                </DataGrid>
            </StackPanel>
        </Grid>
    </GroupBox>
</DockPanel>

我尝试过各种方法,比如在ScrollViewer中包装ListBox,设置“CanContentScroll”的各种组合,但似乎没有任何方法可以使水平滚动条可用

我甚至创建了一个实现IScrollInfo的CustomPanel,希望能让它滚动内容……但这也没用

所以…我又开始吹毛求疵了,剩下的不多了!
提前感谢您提供的帮助。

除非我误解了您的意思,否则我之前的做法是将包含控件的所有代码设置为列表框的ItemTemplate(也不需要DockPanel位)。然后将所有必需的位绑定到chain类的属性,而不是让itemssource充满DockPanel