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

本文关键字:滚动 WPF 用户 控件 用于 | 更新日期: 2023-09-27 18:11:59

我找遍了所有地方都没能找到解决问题的方法。如果我用了错误的方法,我的整个方法可能会出错,我可以重新开始。

我有一个WPF窗口的头,一个列表框,和一个页脚。我想以编程方式添加n个用户控件到列表框,并有列表框本身是可滚动的(不是整个窗口)。我还想关闭当你点击列表框中的一个项目时发生的事情(背景高亮蓝色-我想它改变用户控件的背景,现在把它当作一个大的列表框项目)真的,一个列表框甚至可能是错误的。

我尝试过stackpanel, scrollpanel和其他方法。列表框恰好是我现在使用的。我有十几种不同类型的用户控件,并且基于业务逻辑需要显示它们的一些组合,所以我真的需要一个可滚动的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>

这里是usercontrol。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());
        }

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

首先给你的ListBox一个高度和宽度,要么显式地,要么通过在容器内拉伸它。在ListBox中,你可以使用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>

即兴发挥…是否有一个原因,你不能包装的东西与ScrollViewer,并有包含的控件响应点击传递消息?滚动视图:http://msdn.microsoft.com/en-us/library/ms750665.aspx