C#WPF用户控件的可滚动容器

C#WPF用户控件的可滚动容器,c#,wpf,xaml,C#,Wpf,Xaml,我找遍了所有地方,都找不到解决问题的办法。如果我只是用错误的方法解决这个问题,我的整个方法可能都会失败,我可以重新开始 我有一个带有页眉、列表框和页脚的WPF窗口。我想通过编程将n个用户控件添加到列表框中,并使列表框本身可以滚动(而不是整个窗口)。我还想关闭当您单击列表框中的项目时发生的情况(背景突出显示为蓝色-我希望它更改用户控件的背景,现在将其视为一个大的列表框项目)。实际上,列表框甚至可能是错误的 我尝试过StackPanel、ScrollPanel和六种其他方法。Listbox正好是我现

我找遍了所有地方,都找不到解决问题的办法。如果我只是用错误的方法解决这个问题,我的整个方法可能都会失败,我可以重新开始

我有一个带有页眉、列表框和页脚的WPF窗口。我想通过编程将n个用户控件添加到列表框中,并使列表框本身可以滚动(而不是整个窗口)。我还想关闭当您单击列表框中的项目时发生的情况(背景突出显示为蓝色-我希望它更改用户控件的背景,现在将其视为一个大的列表框项目)。实际上,列表框甚至可能是错误的

我尝试过StackPanel、ScrollPanel和六种其他方法。Listbox正好是我现在使用的。我有十几种不同类型的usercontrols,根据业务逻辑,需要显示它们的一些组合,因此我确实需要一个可滚动的usercontrol容器,在这里我可以确定单击了哪一个(如果有的话)

这是MainWindow.XAML的XAML

<Window x:Class="LayoutTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:customUserControls="clr-namespace:LayoutTest.Properties"
        Title="Layout Sample" Height="Auto" MaxWidth="600" MinWidth="600" Width="600"  ResizeMode="CanMinimize" WindowStartupLocation="CenterScreen">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="393*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>        
        <TextBlock Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="24" TextAlignment="Center" Margin="5,5,210,5">Header</TextBlock>
        <ListBox x:Name="lstPanels" Grid.Row="1" Grid.ColumnSpan="2" HorizontalContentAlignment="Stretch" Margin="0,0,0,17"/>        
        <TextBlock Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="24" TextAlignment="Center" Margin="5,5,210,5">Footer</TextBlock>
    </Grid>
</Window>

标题
页脚
这是UserControl1.XAML的XAML

<UserControl x:Class="LayoutTest.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="100" d:DesignWidth="500" Padding="0" Margin="10">
    <Border BorderThickness="2" BorderBrush="OrangeRed" CornerRadius="10">
        <StackPanel Orientation="Horizontal">
            <Image x:Name="imgLogo" MinWidth="100" MinHeight="100" MaxWidth="100" MaxHeight="100" />
            <Grid MinWidth="400">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="108*" />
                    <ColumnDefinition Width="104*" />
                    <ColumnDefinition Width="188*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="25*" />
                    <RowDefinition Height="35*" />
                </Grid.RowDefinitions>
                <TextBlock Text="xxxxx:" Margin="5,2,2,2" />
                <TextBlock Grid.Column="1" Grid.ColumnSpan="2"  Text="xxxxx" Margin="2" />
                <TextBlock Text="xxxxx:" Grid.Row="1" Margin="5,2,2,2" />
                <TextBlock Grid.Column="1" Grid.Row="1" Text="xxxxxx" Grid.ColumnSpan="2" Margin="2" />
                <CheckBox Content="xxxxxx" Grid.Row="3" Name="chkSkipConfiguration" Grid.ColumnSpan="2" VerticalAlignment="Center" Margin="0,0,112,5" Width="200" HorizontalAlignment="Right" />
                <Button Content="xxxxx" Grid.Column="2" Grid.Row="3"  Padding="0" HorizontalAlignment="Right" Width="50" Margin="0,0,19,0"  />
            </Grid>
        </StackPanel>
    </Border>
</UserControl>

最后,在MainWindow.xaml.cs的构造函数中,有以下代码段用于创建10个用户控件实例:

        for(int i=0; i<10; i++)
        {
            lstPanels.Items.Add(new UserControl1());
        }

用于(int i=0;i只是即兴的…有什么原因不能用ScrollViewer包装东西,并让包含的控件通过传递消息来响应单击吗?ScrollViewer:

首先明确地或通过在容器中拉伸列表框来给列表框一个高度和宽度。使用列表框,您可以定义一个垂直的滚动条using ScrollViewer.VerticalScrollBarVisibility=“Visible”。如果定义了一个高度,则当添加的项目超出该高度时,它应自动启用滚动

就高亮显示而言,请尝试此setter。只需将其放置在针对ListBoxItem类型的样式中:

  <Setter Property="Template">
     <Setter.Value>
        <ControlTemplate TargetType="{x:Type ListBoxItem}">
           <Border x:Name="border" Background="Transparent">
              <ContentPresenter />
           </Border>
           <ControlTemplate.Triggers>
              <Trigger Property="IsSelected" Value="true">
                 <Setter TargetName="border" Property="Background">
                    <Setter.Value>Transparent</Setter.Value>
                 </Setter>
              </Trigger>
           </ControlTemplate.Triggers>
        </ControlTemplate>
     </Setter.Value>
  </Setter>

透明的

在一个点上我尝试了ScLoVIEWS,但是滚动了整个页面。我找不到任何方法来在页面中间得到一组用户控件,同时保持页眉和页脚在任何时候都可见。文档中的示例有ScReVIEW作为顶层元素。可能是这样的,但是我不能得到语法R。当我尝试它时,我只是尝试用scrollviewer替换listbox,并在scrollviewer中放置了一个stackpanel。然后,我将我的UserControl添加到stackpanel.children而不是listbox.items中,得到了相同的结果。我能够让listbox滚动,因此感谢您,但我仍然坚持使用这种样式。使用此标记选择ng listitem会删除默认的蓝色背景,因此这绝对是一个改进。我需要对其进行哪些更改以设置UserControl(listboxitem包含的内容)的背景色相反?UserControl,如我的原始示例所示,有一个橙色边框。如果单击该项时,我能够将UserControl边框内的空间着色,那就太好了。谢谢!如果您将该样式保留在ListBoxItem上,我相信您可以通过向控件添加一个名为IsSelected的属性来实现您想要的效果。如果您处理Border元素的PreviewMouseDown或PreviewMouseUp,并将IsSelected设置为!IsSelected每个事件,然后可以为IsSelected属性添加DataTrigger以更改边框或网格的背景。