Wpf 包装在面板MVVM中的用户控件

Wpf 包装在面板MVVM中的用户控件,wpf,mvvm,wpf-controls,wpfdatagrid,wrappanel,Wpf,Mvvm,Wpf Controls,Wpfdatagrid,Wrappanel,我是WPF/Xaml新手,搜索了我面临的这个问题,但发现它很难解决。在这方面请求一些帮助 我需要在panel/listview中显示水平绑定的usercontrols数据,以便它们在满足listview/panel的宽度时自动换行,并使用垂直滚动条自动显示,如图所示。 到目前为止,我有这个代码 <ListView Grid.Row="3" ItemsSource="{Binding Controls}"

我是WPF/Xaml新手,搜索了我面临的这个问题,但发现它很难解决。在这方面请求一些帮助

我需要在panel/listview中显示水平绑定的usercontrols数据,以便它们在满足listview/panel的宽度时自动换行,并使用垂直滚动条自动显示,如图所示。 到目前为止,我有这个代码

 <ListView Grid.Row="3"
                  ItemsSource="{Binding Controls}"                   
                  VerticalAlignment="Bottom" Background="{x:Null}" BorderBrush="{x:Null}"

                  >



                <ListView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" Margin="0,0,0,10"></StackPanel>
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>
                <ListView.ItemContainerStyle>
                    <Style TargetType="ListViewItem">
                        <Setter Property="VerticalContentAlignment" Value="Bottom"/>
                        <Setter Property="Focusable"  Value="False" />
                    </Style>
                </ListView.ItemContainerStyle>
                <!--<ListView.ItemTemplate>
                    <DataTemplate>
                        <ContentControl Content="{Binding}" VerticalContentAlignment="Bottom"/>
                    </DataTemplate>
                </ListView.ItemTemplate>-->
            </ListView>
我甚至试过下面的代码。是的,它会自动换行,但不会显示滚动条

    <ItemsControl Grid.Row="3"
              Width="100" Height="200" 
              ItemsSource="{Binding Controls}"                   
              VerticalAlignment="Bottom" Background="{x:Null}" BorderBrush="{x:Null}"

              >

            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>                         
                    <WrapPanel Orientation="Horizontal" Margin="0,0,0,10"></WrapPanel>            
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>


        </ItemsControl>
注意:我同意任何使这种情况发生的控制。不一定是列表视图。

您很接近:-

将listview与scrollviewer中的wrapanel视图面板放在一起

<ScrollViewer>
  <ItemsSource="{Binding Controls}">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
         <WrapPanel></WrapPanel>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel> 
  </ItemsControl>
</ScrollViewer>
你很接近:-

将listview与scrollviewer中的wrapanel视图面板放在一起

<ScrollViewer>
  <ItemsSource="{Binding Controls}">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
         <WrapPanel></WrapPanel>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel> 
  </ItemsControl>
</ScrollViewer>

要包装项目,需要将ItemsPanel设置为WrapPanel,如第二个示例所示,但可能需要禁用ListView上的水平滚动:


不要忘记将Grid.Row=3从ItemsControl定义移动到ScrollViewer要包装项目,需要将ItemsPanel设置为WrapPanel,如第二个示例所示,但可能需要禁用ListView上的水平滚动:


不要忘了将Grid.Row=3从ItemsControl定义移动到ScrollViewer,因为您使用的是包裹面板,所以需要指定它的宽度。。。由于wrappanel位于items主机控制面板内部,因此wrappanel本身无法计算宽度。在您的情况下,它将尝试以水平方向获取所有宽度

以下是列表框作为项目主机的示例代码。。。在这段代码中,我将wrappanel宽度绑定到列表框的实际宽度,这样它就不会比列表框的宽度更宽,并且我还禁用了水平滚动,水平方向和垂直包装不需要水平滚动

注意:请确保在使用以下代码之前更改项目模板,它将与所有项目主机一起工作,如ListView、ItemsControl

对于ItemsControl


您正在使用“包裹”面板,因此需要指定该面板的宽度。。。由于wrappanel位于items主机控制面板内部,因此wrappanel本身无法计算宽度。在您的情况下,它将尝试以水平方向获取所有宽度

以下是列表框作为项目主机的示例代码。。。在这段代码中,我将wrappanel宽度绑定到列表框的实际宽度,这样它就不会比列表框的宽度更宽,并且我还禁用了水平滚动,水平方向和垂直包装不需要水平滚动

注意:请确保在使用以下代码之前更改项目模板,它将与所有项目主机一起工作,如ListView、ItemsControl

对于ItemsControl


谢谢,为美沙克工作,为美沙克工作为了线索,它帮助了我去地下之前可以在电话上做的一切,但是你到了那里,所以那很好:-谢谢线索,它帮助了我去地下之前可以在电话上做的一切,但是你到了那里,所以那很好:-
<ScrollViewer Grid.Row="3">
   <ItemsControl ...>
      <!-- .... -->
   </ItemsControl>
</ScrollViewer>
<ListBox Width="500" Height="500" Name="listbox" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal" Width="{Binding ActualWidth,ElementName=listbox}"></WrapPanel>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Height="100" Width="100">
                        <TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
<ItemsControl Grid.Row="3"
              Width="100" Height="200" 
              ItemsSource="{Binding Controls}"                   
              VerticalAlignment="Bottom" Background="{x:Null}" BorderBrush="{x:Null}"
 Name="listbox"
              >

            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>

                    <WrapPanel IsItemsHost="True" Orientation="Horizontal" Width="{Binding ActualWidth,ElementName=listbox}"></WrapPanel>

                </ItemsPanelTemplate>

            </ItemsControl.ItemsPanel>

            <ItemsControl.Template>
                <ControlTemplate>
                    <ScrollViewer x:Name="ScrollViewer" Padding="{TemplateBinding Padding}">
                        <ItemsPresenter />
                    </ScrollViewer>
                </ControlTemplate>
            </ItemsControl.Template>

            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Height="30" Width="30">
                        <TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>

        </ItemsControl>