Сначала возникла проблема с разрывом Expander, не возвращающим пространство.
Основываясь на границах, похоже, ListView не сокращается, а Expander не уменьшается.
Следующий код исправил проблему сокращения.
От ListBox control does not shrink
Это теряет виртуализацию, но я в порядке с этим, поскольку это столько же данных, сколько мне нужно отображать.ListView прыгает или не сжимается
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
Но тогда новая проблема.
Если вы открываете любые два уровня Expander и пытаетесь щелкнуть по флажку, он часто будет прыгать и несколько раз прыгать так сильно, что щелчок не будет установлен.
Прокрутите до конца, поэтому флажок не находится внизу (рядом с ним есть несколько расширителей).
Затем нажмите, и он прыгнет и, скорее всего, даже пропустит предмет.
Я могу предпринять несколько попыток проверить или снять отметку с последней строки.
Довольно уверен, что это происходит из-за того, что клик обрабатывается дважды, и все перемещается между ними.
Итак, как исправить обе проблемы?
1. Свернуть усадку/вернуть пространство?
2. Флажок не прыгает?
Пробное обновление через диспетчер, UpdateLayout(), InvalidateVisual() и Height = Double.NaN.
StackPanel не проблема, так как я могу удалить его и использовать только Exp1 и все еще есть проблема.
Если у вас была аналогичная проблема, дважды щелкнув с SelectedItem, что я смог исправить, заменив второй клик, но это исправление не работает здесь. MissClick
Tried TreeView, но я не показываю ту же информацию на каждом уровне, чтобы она не работала.
Но я открыт для другого подхода.
Двухуровневая иерархия и нужны флажки на втором уровне.
Извините за много кода, но это полная программа для воспроизведения проблемы.
Exp1 идентичен Exp2 и не является действительно необходимым для воспроизведения проблемы, но отражает реальную программу, если кто-то предлагает альтернативное решение.
<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; }
}
}
Я думаю, что здесь есть две ошибки.
Управление не сокращается, а щелчок обрабатывается дважды.
Я получаю усадку, добавляя лишние накладные расходы, но почему бы и нет.
Спасибо. Мне также нужно было использовать то же самое на Expander в ListView. Элемент частично за пределами экрана, который не появляется в поле зрения, намного лучше, чем у меня. – Paparazzi
А, это имеет смысл. Желаю удачи = D – Chris
Я попросил получить это от сообщества wiki, чтобы вы могли получить кредит. Он попал в wiki, поскольку я редактировал его слишком много раз, но основная проблема не изменилась. – Paparazzi