繁体   English   中英

在ListView的选定项目内滚动

[英]Scrolling inside selected Item of a ListView

在WPF- 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;
}

您的问题不是很清楚,但是如果您说ListView使用整个项目滚动,而您希望它使用像素滚动,那么请参见MSDN上的ScrollViewer.CanContentScroll属性页。 如果是这种情况,那么您只需要在ListView上将此Attached属性设置为False即可启用平滑滚动:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM