使WrapPanel尊重父母的宽度

Gab*_*Gab 7 .net wpf user-controls wrappanel scrollviewer

好的,这是我的代码.请注意,StackPanel直接位于UserControl中.

<UserControl>
    <StackPanel Orientation="Horizontal">

        <ScrollViewer Width="450"
                      VerticalScrollBarVisibility="Auto"
                      HorizontalScrollBarVisibility="Disabled">

            <Rectangle Width="400" Height="4000" Fill="BlanchedAlmond"/>
        </ScrollViewer>

        <ScrollViewer VerticalScrollBarVisibility="Auto"
                      HorizontalScrollBarVisibility="Disabled">

            <ItemsControl BorderBrush="Green"
                          BorderThickness="2"
                          ItemsSource="{Binding Path=MyObservableCollection}"
                          ItemTemplate="{StaticResource FatTemplate}">

                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>

            </ItemsControl>
        </ScrollViewer>

    </StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

(代码已编辑)

请注意,矩形就在那里,因为该滚动查看器的内容无关紧要.

问题是WrapPanel只是水平扩展而不包裹......

我找到了一些解决方案:

  1. 为WrapPanel提供绝对宽度(但随后窗口不会调整大小).

  2. 将宽度绑定到其父宽度 - ItemsControl或ScrollViewer(ScrollViewer在像这样的有限情况下工作得更好).

    Width="{Binding RelativeSource=
        {RelativeSource FindAncestor,
        AncestorType={x:Type ScrollViewer}},
        Path=ActualWidth}"
    
    Run Code Online (Sandbox Code Playgroud)

这种技术的问题在于,如果一个控件在StackPanel或Grid旁边,你需要将它绑定到它的父级大小减去旁边的控件.然后是艰难的东西.我构建了一个转换器,它对接收的数字应用数学运算,因此我可以从父宽度中减去给定的宽度:

Width="{Binding RelativeSource=
    {RelativeSource FindAncestor,
    AncestorType={x:Type UserControl}},
    Path=ActualWidth,
    Converter={StaticResource Convertisseur_Size_WXYZ}, 
    ConverterParameter=-260}"
Run Code Online (Sandbox Code Playgroud)

但是,由于您无法绑定传递给ConverterParameter的值,

ConverterParameter={Binding ...} (doesn't work)
Run Code Online (Sandbox Code Playgroud)

我想要:

  • 能够使用我的WrapPanel和ScrollViewer调整大小来调整我的应用程序的大小,
  • 我的UserControl易于维护,
  • 我的代码比依赖父控件的Type的大型绑定表达式更干净.

什么是更好的解决方案?

注意:如果有任何不清楚的地方,我可以添加细节.

Ken*_*art 9

ScrollViewer允许水平滚动时为什么会换行?您应该在以下位置禁用水平滚动ScrollViewer:

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
Run Code Online (Sandbox Code Playgroud)

编辑后编辑:这是因为你StackPanel的水平方向.水平导向StackPanel将提供其子请求的任何宽度 - 它根本不会限制它.使用右侧面板,你会没事的.可能你只想要一个Grid有两列.