- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先遇到的问题是 Expander 崩溃而没有退还空间。
根据边框,似乎 ListView 没有缩小,而不是 Expander 没有缩小。
以下代码修复了缩小问题。
来自 ListBox control does not shrink
这会失去虚拟化,但我对此很满意,因为这就是我需要显示的数据量。
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
但是又出现了一个新问题。
如果您打开任意两级 Expander 并尝试单击复选框,它通常会跳来跳去,有时跳得太多,以至于单击错过了复选框。
一直滚动到底部,使复选框不在底部(下面有一些扩展器)。
然后点击,它会跳转,甚至很可能错过该项目。
我可以尝试多次尝试检查或取消检查最后一行。
很确定这是因为点击被处理了两次并且事物之间发生了移动。
那么如何解决这两个问题呢?
1. 折叠收缩/回馈空间?
2. 复选框不跳转?
尝试通过调度程序、UpdateLayout()、InvalidateVisual() 和 Height = Double.NaN 进行刷新。
StackPanel 不是问题,因为我可以将其删除并仅使用 Exp1,但仍然存在问题。
之前双击 SelectedItem 时也遇到过类似的问题,我可以通过第二次单击来修复该问题,但该修复在这里不起作用。 MissClick
尝试过 TreeView,但我没有在每个级别显示相同的信息,因此它不起作用。
但我愿意接受另一种方法。
两级层次结构,只需要第二级上的复选框。
抱歉,代码太多,但这是重现问题的完整程序。
Exp1 与 Exp2 相同,并不是重现问题所必需的,但它反射(reflect)了真实的程序,以防有人提出替代解决方案。
<Window x:Class="ListViewJump.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="165"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="0" Grid.Column="0"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Visible">
<StackPanel>
<Expander IsExpanded="False" Header="Exp1" BorderThickness="2" BorderBrush="Green">
<ListView ItemsSource="{Binding Path=List1}"
HorizontalAlignment="Left" BorderThickness="2" BorderBrush="Orange">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate >
<DataTemplate>
<Expander Header="{Binding Path=DispName}">
<ListView ItemsSource="{Binding Path=Rows}"
HorizontalAlignment="Left" BorderThickness="2" BorderBrush="Purple">
<ListView.ItemTemplate >
<DataTemplate>
<CheckBox Width="125" IsChecked="{Binding Path=On}">
<TextBlock Text="{Binding Path=StrValue}" TextWrapping="Wrap"/>
</CheckBox>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Expander>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Expander>
<Expander IsExpanded="False" Header="Exp2" BorderThickness="2" BorderBrush="Green">
<ListView ItemsSource="{Binding Path=List2}"
HorizontalAlignment="Left" BorderThickness="2" BorderBrush="Orange">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate >
<DataTemplate>
<Expander Header="{Binding Path=DispName}">
<ListView ItemsSource="{Binding Path=Rows}"
HorizontalAlignment="Left" BorderThickness="2" BorderBrush="Purple">
<ListView.ItemTemplate >
<DataTemplate>
<CheckBox Width="125" IsChecked="{Binding Path=On}">
<TextBlock Text="{Binding Path=StrValue}" TextWrapping="Wrap"/>
</CheckBox>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Expander>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Expander>
</StackPanel>
</ScrollViewer>
</Grid>
</Window>
namespace ListViewJump
{
public partial class MainWindow : Window
{
private List<ListItem> list1 = new List<ListItem>();
private List<ListItem> list2 = new List<ListItem>();
public MainWindow()
{
this.DataContext = this;
for (int i = 1; i < 10; i++)
{
List<ListItemRow> lr1 = new List<ListItemRow>();
List<ListItemRow> lr2 = new List<ListItemRow>();
for (int j = 1; j < 100; j++)
{
lr1.Add(new ListItemRow("Row Row Row Row Row Row" + j.ToString()));
lr2.Add(new ListItemRow("Rwo Rwo Rwo Rwo Rwo Rwo" + j.ToString()));
}
list1.Add(new ListItem("one " + i.ToString(), lr1));
list2.Add(new ListItem("two " + i.ToString(), lr2));
}
InitializeComponent();
}
public List<ListItem> List1 { get { return list1; } }
public List<ListItem> List2 { get { return list2; } }
}
public class ListItem
{
private string dispName;
private List<ListItemRow> rows;
public string DispName { get { return dispName; } }
public List<ListItemRow> Rows { get { return rows; } }
public ListItem(String DispName, List<ListItemRow> Rows) { dispName = DispName; rows = Rows; }
}
public class ListItemRow
{
private string strValue;
private bool on = false;
public string StrValue { get { return strValue; } }
public bool On
{
get { return on; }
set { on = value; }
}
public ListItemRow(String StrValue) { strValue = StrValue; }
}
}
我认为这里有两个错误。
控制不缩小并且点击被处理两次。
我得到收缩会增加开销,但仍然为什么不是一个选择。
最佳答案
花了很多时间研究你的例子,但我最终意识到这种行为的根本原因是什么,以及要寻找什么。
我认为您遇到的问题是由您的 CheckBox
在单击时获得焦点并引发 RequestBringIntoView
事件引起的,这实际上会导致 ScrollViewer
将包含 CheckBox
的控件踢到“正确”的位置。这个答案解释了机制:Stop WPF ScrollViewer automatically scrolling to perceived content .
如果在您单击 CheckBox
时发生滚动,则在您取消单击鼠标之前,它会从您的光标下方移出(您可以通过在出现问题时按住鼠标来演示)发生,然后将鼠标移到有问题的 CheckBox
上,然后释放它)。
您可以为 RequestBringIntoView 创建一个简单的事件处理程序事件并将其与 DataTemplate
中的 CheckBox
一起使用,并使用 Handled
属性抑制该事件,因此它不会进一步传播(以下内容对我有用)。
XAML:
<DataTemplate>
<CheckBox Width="125" IsChecked="{Binding Path=On}" RequestBringIntoView="RequestBringIntoViewSuppressor">
<TextBlock Text="{Binding Path=StrValue}" TextWrapping="Wrap"/>
</CheckBox>
</DataTemplate>
C#:
private void RequestBringIntoViewSuppressor(object sender, RequestBringIntoViewEventArgs e)
{
e.Handled = true;
}
如果您的 CheckBox
稍微偏离屏幕,现在将不再正确地将其自身显示在 View 中,但它不会意外跳转,并且您可以根据需要进一步自定义处理程序。
关于.net - ListView跳转或者不收缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20576934/
我对 ScalaCheck(以及整个 Scala)相当陌生,所以这可能是一个相当简单的解决方案 我正在使用 ScalaCheck 为 AST 生成测试并验证编写器/解析器是否工作。我有这些文件 AST
我首先创建一个特定大小的 JTextArea。用户可以在其中添加文本,但如果它变得太长(垂直或水平),它将被截断。我希望 JTextArea 自动扩展或收缩(用于删除文本)。 我将来可能会允许用户更改
我正在学习如何在浏览器更改大小时调整 div 元素的大小。我希望我的 slider (参见 Fiddle)始终显示 10 张幻灯片,即使浏览器变小(参见下图)也是如此。 目标: 我能想到的实现这一点的
嗨,我在使用 css 面板时遇到了一些问题,我有点想寻求帮助,我的代码运行良好,但是如果用户让浏览器缩小尺寸,面板就会出现在文本下面,这就是我的意思意思是: 这是正常浏览器大小下的样子: 如果用户将浏
我正在研究和实现事件轮廓的贪婪算法,如 Donna Williams 的论文 - 事件轮廓和曲率估计的快速算法中所述。 与另一种实现(Kass 等人的实现)相比的优势之一应该是沿等高线曲线的点均匀分布
在 PHP 中,如何复制 tinyurls 的扩展/收缩功能,就像在 search.twitter.com 上一样? 最佳答案 如果你想找出一个 tinyurl 的去向,使用 fsockopen 在端
有java.io.ZipInputStream膨胀和java.io.ZipOutputStream这会泄气。 但有时我不希望这样。有时,当使用接受 InputStream 的第三方 API 时,我想要
我试图做到这一点,以便在选择文件后,显示文件路径的文本字段会自动收缩/扩展以适合路径。 JFileChooser fileChooser = new JFileChooser(); if (fileC
我有两个 flexbox,它们在高度变化时收缩,嵌套内容重叠。 如何防止这种情况? 最佳答案 just add flex-shrink:0 to your element and the flexbo
想要逐渐“打开”和“关闭”表格中的行,适本地向下推或拉起下面的行。 我能够通过使用 transition 进行计时和使用 transform 进行大小调整来使 div 扩展/收缩(无法使用 heigh
我有一个10列24行的表,可以存储一个值,也可以是=0。它们被称为msg1,msg2...直到msg10。我正在编写一个查询,用 0 而不是任何字段中的特定值来更新此表。 所以我写了(59是一个测试值
有谁知道缩小/压缩 db4o 数据库的方法吗? 最佳答案 压缩/收缩是什么意思?缩小现有数据库?还是要压缩数据库? 其中一个角色是 defragmentation .这将释放数据库中未使用的空间。删除
我正在使用 flexbox 来布局页面,因为 growing 行为很有用。但我想完全防止收缩行为。 无论如何要管理这个? 示例代码: This one should gr
我是 jQuery/Javascript 的新手,甚至是通过缩小的 jQuery/Javascript 进行搜索的新手。 我正在尝试重新创建我在 Materialize 框架的表单组件中找到的一些功能
我有一个对象表及其类型,如下所示: objectType | object 107 Boeing 107 Airbus 323 Audi 323
我正在尝试使用以编程方式构建的 TableLayout 将 20x20 表格放入 View 中。 setStretchAllColumns/setShrinkAllColumns 方法非常适合压缩所有
我有一个 QDialog 和一个 QVBoxLayout 控制它的高度。 这个主要的 QVBoxLayout 由一个或多个 QVBoxLayout child 组成,后面是一些其他小部件。当我添加额外
如何缩小任意(未指定)宽度的居中图像周围的 anchor (绿色边框)?换句话说,我想要绿色边框居中的秒框,就像第一个一样。没有 float ,没有绝对定位。 移除行 (A) 中心,但 anchor
我正在制作一款安卓游戏。我在 Galaxy sII 上测试我的应用程序。我取得了很大进步。不幸的是,我忽略了对其他设备进行测试。我知道我会遇到不同类型设备的不同分辨率问题。但我认为我可以通过安排我的坐
如果 GUI 设计人员使用特定设备屏幕尺寸作为引用点提供 iOS 设计,那么如果应用程序在不同设备上运行,如何使字体扩展或收缩? 即假设设计者提供了一个以 iPhone 8 屏幕尺寸为引用的单一设计,
我是一名优秀的程序员,十分优秀!