用于显示复杂用户控件集合的ListBox控件不能水平滚动
本文关键字:控件 ListBox 不能 水平 滚动 集合 显示 复杂 用户 用于 | 更新日期: 2023-09-27 18:15:47
我一直在与这个问题抗争ListBox很长一段时间。我有一个显示股票期权链的MVVM应用程序。
OptionChainViewModel创建每个单独的链-每个可用的有效期一个。
然后我尝试用ListBox来显示这些"链",ListBox有一个ItemsPanelTemplate,我有一个StackPanel。
虽然我可以让HorizontalScrollBar显示,但它不是活动的,我不能让内容水平滚动。我试过在StackPanel以及ListBox本身设置MaxWidth,但无济于事。我还在OptionViewModel对象上设置了MaxWidth和Width,但无济于事。
我已经查看了可视化树,发现scrollviewer就在ListBoxItems之前,它的MaxWidth和MaxHeight被设置为"无穷大",所以我在我的视图模型上插入了一个方法,当我点击视图中的按钮时调用。该方法找到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"的各种组合,似乎没有任何东西导致水平滚动条可用。
我甚至创建了一个CustomPanel,实现了IScrollInfo,希望我能让它滚动内容…
所以…我又开始拔头发了,剩下的不多了!
除非我误解了您,否则我之前处理此问题的方法是将包含控件的所有代码设置为列表框的ItemTemplate (DockPanel位也不需要)。然后将所有必需的位绑定到链类的属性,而不是让您的itemssource充满DockPanels