[WPF](小结1)ListBox嵌套ListBox

摘要:
--用Canvas来装可以精确定位项,但没有水平滚动条Canvas.Left="{BindingPath=LeftWidth}"Canvas.Top="0"只好用StackPanel来布局--˃˂!

[WPF](小结1)ListBox嵌套ListBox第1张

思路:大项目的每项中包含一个小项目集合,用ListBox嵌套ListBox或ListBox嵌套ItemsCtrol是个比较好的方式,现总结如下:
第一:先构建题目类,再建一个选项类,题目类集合中的每个项包含一个选项类集合,即数组嵌套数组,C#语句如下:
(为方便看清语句,类直接写在主程序中)
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows;
usingSystem.Windows.Controls;
usingSystem.Windows.Data;
usingSystem.Windows.Documents;
usingSystem.Windows.Input;
usingSystem.Windows.Media;
usingSystem.Windows.Media.Imaging;
usingSystem.Windows.Navigation;
usingSystem.Windows.Shapes;
using System.Collections.ObjectModel;//ObservableCollection命名空间
namespaceListBoxInListBox
{
    /// <summary>
    ///MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial classMainWindow : Window
    {
        publicMainWindow()
        {
            InitializeComponent();
        }
        //题目类
        classquestion
        {
            public string qutestionName//题目名,比如:第1题或第2题等
            { get; set; }
            public ObservableCollection<choseItem> choseItems//某题中"选项类"的集合,比如A-D
            { get; set; }
            public question(string _questionname, ObservableCollection<choseItem> _choseitems)//构造函数
{
                qutestionName =_questionname;
                choseItems =_choseitems;
            }
        }
        //选项类
        classchoseItem
        {
            public string ChoseName//选项名,比如:A,B,C,D之类
            { get; set; }
            public string ChoseContent//选项内容
            { get; set; }
        }
        ObservableCollection<question> Questions = new ObservableCollection<question>();//题目数组
        private void Window_Loaded(objectsender, RoutedEventArgs e)
        {
            string[] CharStr = new string[4] { "A", "B", "C", "D"};
            for (int i = 0; i < 5; i++)
            {
                ObservableCollection<choseItem> ChoseItems = new ObservableCollection<choseItem>();//选项数组               
                for (int j = 0; j < 4; j++)
                {
                    choseItem item = new choseItem();//选项类
                    item.ChoseName = CharStr[j] + ":";
                    item.ChoseContent = "选项内容";
                    ChoseItems.Add(item);
                }
                Questions.Add(new question("__第" + (i + 1).ToString() + "", ChoseItems));
            }
            listbox1.ItemsSource =Questions;
        }

    }
}

第二步:主界面的绑定语句如下:

<Window x:Class="ListBoxInListBox.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="ListBox嵌套ListBox测试" Height="350" Width="525" Loaded="Window_Loaded">
   
    <Window.Resources >
        <!--第一部分:内嵌的ListBox用什么布局-->
        <ItemsPanelTemplate x:Key="itemspanel">
            <StackPanel Orientation="Horizontal" VerticalAlignment="Center" />
        </ItemsPanelTemplate>
        <!-- 第二部分:内嵌ListBox的项模板-->
        <DataTemplate x:Key="itemstemplate">
            <!-- 用Canvas来装可以精确定位项,但没有水平滚动条Canvas.Left="{Binding Path=LeftWidth}" Canvas.Top="0"只好用StackPanel来布局-->
            <StackPanel  Orientation="Vertical"  >
                <Border  BorderBrush="Blue"   BorderThickness="1" CornerRadius="3"   >
                    <StackPanel  Orientation="Horizontal"  Margin="5,0,5,0">
                        <!-- 这里是装项内容-->
                        <Image  Source="/zero.png" Width="32" Height="32"  />
                        <TextBlock Text="{Binding Path=ChoseName}"  VerticalAlignment="Center" Margin="2" />
                        <TextBox  Text="{Binding Path=ChoseContent}" IsReadOnly="True" Margin="2"VerticalAlignment="Center"  >
                        </TextBox>
                    </StackPanel>
                </Border>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
   
    <Grid>
        <ListBox Name="listbox1" Margin="5" HorizontalContentAlignment="Stretch" ><!-- 最外层ListBox-->
            <ListBox.ItemTemplate >
                <DataTemplate >
                    <StackPanel Orientation="Horizontal" >
                        <Border Margin="5" Padding="3" BorderBrush="Green"  BorderThickness="1" CornerRadius="2">
                            <StackPanel Orientation="Horizontal" >
                                <CheckBox Content="选择该题" Margin="3"></CheckBox>
                                <TextBlock Text="{Binding qutestionName}" Margin="3"/>
                                <ListBox  Name="listbox2" ItemsSource="{Binding choseItems}"ItemsPanel="{StaticResource itemspanel}"ItemTemplate="{StaticResource itemstemplate}"/>
                                <!-- 如果内嵌项不需要单个项选择,可考虑把ListBox换成ItemsControl-->
                            </StackPanel>
                        </Border>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

第三:小结一下:

1:内嵌项经常不需要分开点击显示,则可以直接把内嵌ListBox换成ItemsControl,效果为单击选中所有项;
2:内嵌项用Canvas没有成功,会造成外ListBox没有水平滚动条,用StackPanel来布局比较合适
3:嵌套类型模板的使用需要配合设置选中块触发界面颜色的变化,否则会很不习惯或很难看,可以参考我的"小颗豆计票统计器"选中项状态图,随意更改外观.

[WPF](小结1)ListBox嵌套ListBox第2张

免责声明:文章转载自《[WPF](小结1)ListBox嵌套ListBox》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用TCPDF插件生成pdf以及pdf的中文处理海信电视使用优酷投屏的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF学习笔记三 依赖属性

概述: Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能。这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。 依赖项属性提供用来扩展属性功能的功能, 最常用的莫过于“数据绑定”功能,依赖项属性可以通过数据绑定来引用值。数据...

学习WPF——了解WPF中的XAML

XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Button对象 XAML可以在一个元素中嵌套另一个元素,例如Grid元素可以嵌套Button元素   了解XAML VisualStudio创建一个窗口,默认...

wpf 获取datagrid中模板中控件

//获取name为datagrid中第三列第一行模板的控件 FrameworkElement item = dataGrid.Columns[3].GetCellContent(dataGrid.Items[0]); DataGridTemplateColumn temp = dataGrid.Column...

WPF——菜单栏及TabControl

一、先造一个窗体,然后在窗体里面增加菜单栏及原始的TabControl选项卡 <Grid> <Menu> <MenuItem Header="文件" Click="MenuItem_Click_3"> <MenuItem Header="打...

WPF实现渐变淡入淡出的动画效果

1、实现原理 1.1 利用UIElement.OpacityMask属性,用于改变对象区域的不透明度的画笔。可以使元素的特定区域透明或部分透明,从而实现比较新颖的效果。 1.2 OpacityMask属性接受任何画刷,可利用LinearGradientBrush线性渐变画刷,通过对渐变画刷中各颜色点加以动画处理即可。 2、渐变淡入实现 渐变淡入效果,可通过...

WPF 制作圆角按钮

在程序对应坐置插入以下代码,或是先拖一个按钮控件到窗体中,再替换对应的代码。 修改CornerRadius="18,3,18,3" 就可以改变圆角大小 按钮效果: <Button Content="Button" HorizontalAlignment="Left" Margin="19,10,0,0" VerticalAlignment="Top...