我想修改原始的ListBox控件,每个项目里面都有一个CheckBox,Labels和一个Button控件。
有没有最佳方法可以做到这一点?没有从一开始就制作自定义控件?
制作继承ListBox的自定义控件可能不是一个坏主意,但不知道如何...
我试过WPF,但此时太难了。实际上,通过XAML设计控件很简单,但管理列表项(添加/删除文本,从每个项目的按钮获取事件)不是。
答案 0 :(得分:0)
除了使用WPF之外,最好的方法是创建一个自定义UserControl
,它代表列表中的每个项目。然后,在表单中添加FlowLayoutPanel
。将面板的AutoScroll
属性设置为True
。然后将其FlowDirection
属性设置为TopToBottom
。然后,为您需要添加到列表中的每个项目动态创建一个自定义控件,并调用面板的Controls.Add
方法将它们添加到列表中。
答案 1 :(得分:0)
由于问题标记为[WPF]
,我将提供WPF答案:
任何面临WPF的开发人员都会立即尝试做的第一件事就是使用它,就好像它是winforms一样。这是一个很大的错误。
如果你正在使用WPF,你真的需要抛弃winforms等古老技术中使用的传统方法,理解并拥抱The WPF Mentality。
在WPF中,您不是“添加/删除文本,从每个项目中的按钮获取事件”或其中任何一项,只是因为UI is not Data。
而是定义一个简单的数据模型:
public class MyData
{
public string MyText1 {get;set;}
public string MyText2 {get;set;}
}
然后声明性地在UI中定义Data Bindings以将“show”此数据发送到UI,而不是“阅读”或“写作” “来自UI的数据:
<Window x:Class="WpfApplication14.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication14"
Title="MainWindow" Height="350" Width="525">
<ListBox ItemsSource="{Binding}" HorizontalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
<Border Margin="5" Background="LightCyan" BorderBrush="LightSkyBlue" BorderThickness="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Content="Text 1:" HorizontalAlignment="Right"/>
<Label Grid.Row="1" Grid.Column="0" Content="Text 2:" HorizontalAlignment="Right"/>
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding MyText1}"/>
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding MyText2}"/>
<Button Grid.Row="2" Grid.ColumnSpan="2" Content="Button" HorizontalAlignment="Center"/>
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Window>
最后,您将窗口或视图的DataContext定义为相关实例或此类数据的集合:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = Enumerable.Range(0,10)
.Select(x => new MyData()
{
MyText1 = "Text1 - " + x.ToString(),
MyText2 = "Text2 - " + x.ToString()
});
}
}
所有这些导致:
请参阅?非常简单而美丽。
忘记winforms, WPF Rocks 。只需将我的代码复制并粘贴到File -> New Project -> WPF Application
中,然后自行查看结果。