【问题标题】:How to add arrow to each WPF listview column to indicate sort direction如何向每个 WPF listview 列添加箭头以指示排序方向
【发布时间】:2011-03-22 15:34:59
【问题描述】:

我有一个gridview ...有多个列。如果我单击一列,它会根据该列值对 gridview 进行排序。我喜欢在“点击”的列标题中添加一个箭头(当用户点击时),以显示“点击了这个特定的列,这是排序方向”

我该怎么做?

我看到了一个示例链接 How to I display a sort arrow in the header of a list view column using C#?

但它使用 Windows.Forms.ListView..但我使用的是 Windows.Controls.Listview :(

【问题讨论】:

    标签: wpf listview header


    【解决方案1】:

    我使用本教程解决了您遇到的相同问题: http://www.switchonthecode.com/tutorials/wpf-tutorial-using-the-listview-part-2-sorting

    它包含使用自定义 Adorner 的解决方案,该 Adorner 添加到 ListView-Header 中。

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Collections.ObjectModel;
    using System.Windows.Shapes;
    using System.ComponentModel;
    using System.Windows.Media;
    using System.Windows.Documents;
    
    namespace ListViewTest3
    {
      public partial class ListViewTest : Window
      {
        private ObservableCollection<GameData> _GameCollection =
            new ObservableCollection<GameData>();
    
        private GridViewColumnHeader _CurSortCol = null;
        private SortAdorner _CurAdorner = null;
    
        public ListViewTest()
        {
          _GameCollection.Add(new GameData {
              GameName = "World Of Warcraft",
              Creator = "Blizzard",
              Publisher = "Blizzard" });
          _GameCollection.Add(new GameData {
              GameName = "Halo",
              Creator = "Bungie",
              Publisher = "Microsoft" });
          _GameCollection.Add(new GameData {
              GameName = "Gears Of War",
              Creator = "Epic",
              Publisher = "Microsoft" });
    
          InitializeComponent();
        }
    
        public ObservableCollection<GameData> GameCollection
        { get { return _GameCollection; } }
    
        private void AddRowClick(object sender, RoutedEventArgs e)
        {
          _GameCollection.Add(new GameData {
              GameName = "A New Game",
              Creator = "A New Creator",
              Publisher = "A New Publisher" });
        }
    
        private void SortClick(object sender, RoutedEventArgs e)
        {
          GridViewColumnHeader column = sender as GridViewColumnHeader;
          String field = column.Tag as String;
    
          if (_CurSortCol != null)
          {
            AdornerLayer.GetAdornerLayer(_CurSortCol).Remove(_CurAdorner);
            gameListView.Items.SortDescriptions.Clear();
          }
    
          ListSortDirection newDir = ListSortDirection.Ascending;
          if (_CurSortCol == column && _CurAdorner.Direction == newDir)
            newDir = ListSortDirection.Descending;
    
          _CurSortCol = column;
          _CurAdorner = new SortAdorner(_CurSortCol, newDir);
          AdornerLayer.GetAdornerLayer(_CurSortCol).Add(_CurAdorner);
          gameListView.Items.SortDescriptions.Add(
              new SortDescription(field, newDir));
        }
      }
    
      public class GameData
      {
        public string GameName { get; set; }
        public string Creator { get; set; }
        public string Publisher { get; set; }
      }
    
      public class SortAdorner : Adorner
      {
        private readonly static Geometry _AscGeometry =
            Geometry.Parse("M 0,0 L 10,0 L 5,5 Z");
        private readonly static Geometry _DescGeometry =
            Geometry.Parse("M 0,5 L 10,5 L 5,0 Z");
    
        public ListSortDirection Direction { get; private set; }
    
        public SortAdorner(UIElement element, ListSortDirection dir)
          : base(element)
        { Direction = dir; }
    
        protected override void OnRender(DrawingContext drawingContext)
        {
          base.OnRender(drawingContext);
    
          if (AdornedElement.RenderSize.Width < 20)
            return;
    
          drawingContext.PushTransform(
              new TranslateTransform(
                AdornedElement.RenderSize.Width - 15,
                (AdornedElement.RenderSize.Height - 5) / 2));
    
          drawingContext.DrawGeometry(Brushes.Black, null,
              Direction == ListSortDirection.Ascending ?
                _AscGeometry : _DescGeometry);
    
          drawingContext.Pop();
        }
      }
    }
    

    【讨论】:

    • 从 .NET 3.0 开始支持;见msdn.microsoft.com/de-de/library/…
    • 网站不再可用。
    • @Michael 感谢您的通知。我在archive.org 上查找了该网站,并将教程的最终结果添加到我的帖子中。
    猜你喜欢
    • 2013-07-12
    • 2010-09-25
    • 1970-01-01
    • 2018-10-24
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多