2013-12-13 2 views
4

Сначала возникла проблема с разрывом 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; } 
    } 
} 

Я думаю, что здесь есть две ошибки.
Управление не сокращается, а щелчок обрабатывается дважды.
Я получаю усадку, добавляя лишние накладные расходы, но почему бы и нет.

ответ

2

Для примера вам потребовалось немало усилий, но я в конце концов понял, в чем была причина этого поведения, и что искать.

Я думаю, что вы столкнулись с проблемой, вызванной вашим CheckBox увеличиваясь внимание при нажатии, и поднимая RequestBringIntoView событие, которое по существу привести к тому ScrollViewer пнуть управления, содержащий ваш CheckBox в «правильном» месте. Механика объясняется в этом ответе: Stop WPF ScrollViewer automatically scrolling to perceived content.

Если этот прокрутка происходит, когда вы нажимаете на CheckBox, он будет выходить из-под вашего курсора, прежде чем вы сможете отпереть мышь (вы можете продемонстрировать это, удерживая мышь, когда проблема возникает, а затем перемещая наведите мышку на CheckBox, и выпуская его).

Вы можете создать простой обработчик событий для RequestBringIntoView события и использовать его с CheckBox в вашей DataTemplate и подавить событие, используя 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 бы теперь уже не правильно привести себя в поле зрения, если она была немного от экрана, но это не будет прыгать неожиданно, и при необходимости вы можете настроить обработчик.

+0

Спасибо. Мне также нужно было использовать то же самое на Expander в ListView. Элемент частично за пределами экрана, который не появляется в поле зрения, намного лучше, чем у меня. – Paparazzi

+0

А, это имеет смысл. Желаю удачи = D – Chris

+0

Я попросил получить это от сообщества wiki, чтобы вы могли получить кредит. Он попал в wiki, поскольку я редактировал его слишком много раз, но основная проблема не изменилась. – Paparazzi

Смежные вопросы