我看了一遍,一直无法找到问题的解决方案。我的整个方法可能都没有了,如果我只是以错误的方式解决这个问题,我可以重新开始。
我有一个带有标题,列表框和页脚的WPF窗口。我想以编程方式将n个用户控件添加到列表框中,并使列表框本身可滚动(而不是整个窗口)。我还想关闭当您单击列表框中的项目时发生的事情(背景突出显示蓝色 - 我希望它更改用户控件的背景,现在将其视为一个大的列表框项目)真的列表框可能是错误的的事情。
我尝试过stackpanels,scrollpanels和其他六种方法。列表框恰好就是我现在正在使用的。我有十几种不同类型的用户控件,并且基于业务逻辑,需要显示它们的一些组合,所以我真的需要一个可滚动的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());
}
答案 0 :(得分:3)
首先明确地或通过在容器内拉伸它来为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>
答案 1 :(得分:1)
刚刚关闭袖口...有没有理由你不能用ScrollViewer包装东西并让包含的控件通过传递消息来响应点击? ScrollViewer:http://msdn.microsoft.com/en-us/library/ms750665.aspx