WPF中Expander与ListBox(ItemsControl)嵌套中的问题

1. 当ListBox放在Expander中时,为了要实现实时更新数据的效果,这里使用了

ObservableCollection类型来作为数据源,

初始的简单例子如下:只有一个ListBox

xaml文件

 1 <Window x:Class="ObservableCollectionAddRemoveDemo.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         Title="MainWindow" Height="350" Width="525">
 5     <Grid>
 6         <ListBox BorderBrush="Red" BorderThickness="2" HorizontalAlignment="Left" Height="Auto" Margin="37,32,0,0" VerticalAlignment="Top" Width="157" ItemsSource="{Binding}">
 7             <ListBox.ItemContainerStyle>
 8                 <Style TargetType="ListBoxItem" >
 9                     <Setter Property="Opacity" Value="0.5" />
10                     <Setter Property="Opacity" Value="0.5" />
11                     <Setter Property="MaxHeight" Value="75" />
12                     <Setter Property="Background" Value="Green"/>
13                     <Style.Triggers>
14                         <Trigger Property="IsSelected" Value="True">
15                             <Setter Property="Opacity" Value="1.0" />
16                         </Trigger>
17                     </Style.Triggers>
18                 </Style>
19             </ListBox.ItemContainerStyle>
20         </ListBox>
21         <ItemsControl HorizontalAlignment="Left" Height="auto" Margin="210,32,0,0" VerticalAlignment="Top" Width="157" ItemsSource="{Binding}">
22             <ItemsControl.ItemContainerStyle>
23                 <Style TargetType="ContentPresenter">
24                     <Setter Property="Opacity" Value="0.5" />
25                     <Setter Property="Opacity" Value="0.5" />
26                     <Setter Property="MaxHeight" Value="75" />
27                 </Style>
28             </ItemsControl.ItemContainerStyle>
29         </ItemsControl>
30         <Button Content="Add" HorizontalAlignment="Left" Margin="398,65,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
31         <Button Content="Remove" HorizontalAlignment="Left" Margin="398,160,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_Remove"/>
32
33     </Grid>
34 </Window>

后台文件

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Collections.ObjectModel;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 using System.Windows;
 8 using System.Windows.Controls;
 9 using System.Windows.Data;
10 using System.Windows.Documents;
11 using System.Windows.Input;
12 using System.Windows.Media;
13 using System.Windows.Media.Imaging;
14 using System.Windows.Navigation;
15 using System.Windows.Shapes;
16
17 namespace ObservableCollectionAddRemoveDemo
18 {
19     /// <summary>
20     /// Interaction logic for MainWindow.xaml
21     /// </summary>
22     public partial class MainWindow : Window
23     {
24         public ObservableCollection<String> list;
25         //public List<String> list;
26         public MainWindow()
27         {
28             InitializeComponent();
29             list = new ObservableCollection<string>() { "asda","12asdas","a22321","asda112323","xcvcvcxv","aasda","123123","asdasdasd"};
30             this.DataContext = list;
31         }
32
33         private void Button_Click(object sender, RoutedEventArgs e)
34         {
35             int addNumber = new Random().Next(999);
36             list.Add(addNumber.ToString());
37         }
38
39
40         private void Button_Click_Remove(object sender, RoutedEventArgs e)
41         {
42             if (list.Count > 0)
43                 list.RemoveAt(0);
44         }
45     }
46 }

发现代码实现的很顺畅,无论是增删都能实时响应到界面中

2. 但当在ListBox外面套一个Expander时,问题就出现了,如下图:

在删除数据时,内容明显变少了,但属于删掉内容的位置确仍然保留在界面上!!!

解决的办法是:在Expander的 ContentPresenter外面套一个StackPanel,如下:

1  <StackPanel>
2          <ContentPresenter x:Name="ExpanderContent" ContentSource="Content"/>
3 </StackPanel>

===========================================

当将Expander放在ListBox中时也有可能会出现类似的问题:https://www.dotblogs.com.tw/ouch1978/archive/2011/03/11/wpf-expander-in-listbox.aspx

时间: 2024-10-05 16:31:57

WPF中Expander与ListBox(ItemsControl)嵌套中的问题的相关文章

WPF触屏Touch事件在嵌套控件中的响应问题

原文:WPF触屏Touch事件在嵌套控件中的响应问题 前几天遇到个touch事件的坑,记录下来以增强理解. 具体是 想把一个listview嵌套到另一个listview,这时候如果list view(子listview)的内容过多超过容器高度,它是不会出现滚动条压缩内容区域的,反而会将滚动区域转移到外面的list view(父listview),这个无可争议,但这个问题开始没留意,为待会的坑埋下伏笔. 因为 然后就是设置鼠标滚轮. 首先我使用了MouseWheel事件,奇怪的是它明明是个路由事件

关于ListBox在Grid中无法充满的问题

WPF布局的时候发现一个问题,ListBox放在Grid中的时候,老是无法充满整个Grid,但是查看代码也没有设置相关的属性,原来在设置ListBox之前首先要让ListBox的容器充满,然后ListBox才能充满整个布局,具体代码如下: <ListBox.ItemContainerStyle>    <Style TargetType="ListBoxItem">        <Setter Property="HorizontalAlign

WPF - 为什么不能往Library的工程中添加WPF window

项目中添加一个Library 工程,但是却无法加入WPF window, WPF customize control. 调查了一下,发现这一切都由于Library工程中没有:ProjectTypeGuids <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="

MFC中listbox控件中各种属性的详解

 ListBox控件是Windows 窗体的一个空间,ListBox 控件显示一个项列表,用户可从中选择一项或多项.      如果项总数超出可以显示的项数,则自动向 ListBox 控件添加滚动条.当 MultiColumn 属性设置为 true 时,列表框以多列形式显示项,并且会出现一个水平滚动条.当 MultiColumn 属性设置为 false 时,列表框以单列形式显示项,并且会出现一个垂直滚动条.当 ScrollAlwaysVisible 设置为 true 时,无论项数多少都将显示滚动

mysql中insert与select的嵌套使用

如何在mysql从多个表中组合字段然后插入到一个新表中,通过一条sql语句实现.具体情形是:有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,我们可以使用如下的语句来实现: INSERT INTO db1_name(field1,field2) SELECT field1,field2 FROM db2_name 当然,上面的语句比较适合两个表的数据互插,如果多个表就不适应了.对于多个表,我们可以先将需要查询的字段join起来,然后组成一个视图后再

【C#/WPF】保存BitmapImage数据到文件中

原文:[C#/WPF]保存BitmapImage数据到文件中 参考: http://stackoverflow.com/questions/35804375/how-do-i-save-a-bitmapimage-from-memory-into-a-file-in-wpf-c /// <summary> /// 把内存里的BitmapImage数据保存到硬盘中 /// </summary> /// <param name="bitmapImage">

对ListBox控件中的数据进行排序

实现效果: 知识运用: ListBox控件的Sorted属性 //ListBox控件中的数据项是否按字母顺序排序 public bool Sorted{get;set;} 实现代码: private void button1_Click(object sender, EventArgs e) { listBox1.Sorted=true; } 原文地址:https://www.cnblogs.com/feiyucha/p/10159855.html

OpenCV 中 IplImage、CvMat、Mat中的type是怎么回事?

在使用opencv的过程中,无论使用原始的IplImage和CvMat类型,还是用最新C++版本的Mat类型,在创建和使用过程中,经常会遇到CV_8UC1.CV_8UC3.CV_32FC3等声明,我以前也经常遇到,曾经看懂了,现在又忘记了,现在把它写下来,方便以后查看,遇到同样问题的菜鸟也能尽快理解这些声明是怎么回事. 先把opencv源代码贴出来 #define CV_CN_MAX 512 #define CV_CN_SHIFT 3 #define CV_DEPTH_MAX (1 << CV

scala中的map函数与for中的yield

首先我们从scala的函数开始: 在命令后输入:(x:Int) => x * 2 这种奇怪的格式让我们陌生,但是如果你熟悉javascript的函数如下: function myfunc(param){ alert("hello" + param); } 这是一个弹出窗口hello的函数,显示的是hellp+输入参数,这个param不只是可以传入值,也可以传入另外一个函数,为了能够传入另外一个函数作为参数,被传入的函数在写法上要改变一下,比如: var myfunc2 = fun