【问题标题】:Scrolling inside selected Item of a ListView在 ListView 的选定项目内滚动
【发布时间】:2014-01-27 13:32:16
【问题描述】:

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

【问题讨论】:

    标签: c# wpf listview scroll selecteditem


    【解决方案1】:

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

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

    【讨论】:

    • 正是我正在寻找的。谢谢!
    • @rhe1980 - 请注意将其设置为 false 将disable UI Vritualization on ListView
    • @RohitVats:好点子!谢谢。实际上我只有很少的项目,只有选定的项目需要更多空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多