2014-01-27 71 views
0

在WPF- ListView控制选定的项目必须可视化一些额外的细节。 如果选择一个项目,则需要更多的空间,然后ListView控件提供。在ListView的选定项目内滚动

默认情况下,不能在所选项目内滚动。向下滚动, 它直接跳到下一个项目,并且不可能看到所选项目的底部部分。

任何想法如何启用在所选项目内滚动?

以下代码演示了该行为。在实际的代码所选择的项目是比较复杂的,但举个例子,当选择它只是修改所选项目的大小:

XAML:

<Window x:Class="ListViewWithLargeSelectedItem.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="300" Width="300"> 
<Grid> 
    <ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" HorizontalContentAlignment="Stretch"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <Border x:Name="border" Padding="10" HorizontalAlignment="Stretch"> 
        <TextBlock Text="{Binding Text}" /> 
       </Border> 
       <DataTemplate.Triggers> 
        <DataTrigger Binding="{Binding IsSelected}" 
              Value="true"> 
         <Setter TargetName="border" Property="Padding" 
             Value="40,200" /> 
        </DataTrigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 

代码背后:

public partial class MainWindow : Window 
{ 
    private CustomItem _selectedItem; 
    public CustomItem SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      if (_selectedItem != null) 
      { 
       _selectedItem.IsSelected = false; 
      } 
      _selectedItem = value; 
      _selectedItem.IsSelected = true; 
     } 
    } 

    public List<CustomItem> Items 
    { 
     get { return (List<CustomItem>)GetValue(ItemsProperty); } 
     set { SetValue(ItemsProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsProperty = 
      DependencyProperty.Register("Items", typeof(List<CustomItem>), typeof(MainWindow), new UIPropertyMetadata(null)); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Items = new List<CustomItem>(); 
     for (int i = 0; i < 10; i++) 
     { 
      Items.Add(new CustomItem() { IsSelected = false, Text = "ITEM " + i });    
     } 
     DataContext = this; 
    } 
} 

public class CustomItem : INotifyPropertyChanged 
{ 
    public string Text { get; set; } 
    private bool _isSelected; 
    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
      if (_isSelected == value) 
      { 
       return; 
      } 

      _isSelected = value; 
      NotifyOfPropertyChange("IsSelected"); 
     } 
    } 

    private void NotifyOfPropertyChange(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 
} 

回答

1

你的问题不是很清楚,但如果你说您的ListView使用整个项目滚动并且希望它使用像素进行滚动,然后请参阅MSDN上的ScrollViewer.CanContentScroll property页面。如果是这样的话,那么你只需要设置附加属性来FalseListView,使平滑滚动:

<ListView ScrollViewer.CanContentScroll="False" ... /> 
+0

正是我一直在寻找的。谢谢! – rhe1980

+1

@ rhe1980 - 当心将此设置为false将会禁用ListView上的UI Vritualization。 –

+0

@RohitVats:好点!谢谢。其实我只有很少的项目,只有选定的项目需要更多的空间。 – rhe1980