[Xamarin.Mac] コレクションビューで選択状態を表示してみました

2020.12.10

1 はじめに

CX事業本部の平内(SIN)です。

Xamarin.Macを使用すると、C#でネイティブなMacのアプリが作成可能です。 ここでは、私自身がXamarin.Macに入門して学習した事項を覚書として書かせて頂いています。

今回は、コレクションビューでアイテム選択時の動作を確認してみました。

なお、下記で作成した、コレクションビューを元にして作業を進めています。

2 Selectable

NSCollectionViewでアイテムの選択を有効にするには、Selectableにチェックを入れる必要があります。

3 ItemsSelected

NSCollectionViewに登録されたDelegateで、ItemsSelected() / ItemsDeselected()をオーバーライドすることで、アイテムが選択(選択解除)されたタイミングの処理を記述できます。

public class CollectionViewDelegate: NSCollectionViewDelegateFlowLayout {
        public CollectionViewDelegate() {
        }

        // アイテムが選択されたタイミングで呼ばれる
        public override void ItemsSelected(NSCollectionView collectionView, NSSet indexPaths) {
            var paths = indexPaths.ToArray<NSIndexPath>();
            var index = (int)paths[0].Item;
            Console.WriteLine($"{index} selected.");
        }

        // アイテムの選択が解除されたタイミングで呼ばれる
        public override void ItemsDeselected(NSCollectionView collectionView, NSSet indexPaths) {
            var paths = indexPaths.ToArray<NSIndexPath>();
            var index = (int)paths[0].Item;
            Console.WriteLine($"{index} deslected.");
        }
    }

上記の追加により、アイテムをクリックする度に、ログが表示されている事を確認できます。

4 Selected

アイテムのビュークラスで、Selectedプロパティが変化するタイミングで、表示を変化させる事で、選択された状態を表現することができます。

ImageViewLabelの表示を変更するために、Outletを作成します。

Selectedプロパティをオーバーライドして、フォントや、枠線を変化させてみました。

public partial class PictureViewController : NSCollectionViewItem {

  public override bool Selected {
    get {
      return base.Selected;
    }
    set {
      base.Selected = value;

      if(value) {
        TextLabel.Font = NSFont.SystemFontOfSize(11, 1);
        TextLabel.TextColor = NSColor.Red;
        ImageView.Layer.BorderColor = NSColor.Red.CGColor;
        ImageView.Layer.BorderWidth = 3;
      } else {
        TextLabel.Font = NSFont.SystemFontOfSize(11, (nfloat)0.1);
        TextLabel.TextColor = NSColor.Black;
        ImageView.Layer.BorderWidth = 0;
      }
    }
  }

動作している様子です。トマト羊が選択状態にある事が視覚的に表現されています。

5 最後に

コレクションビューでは、デフォルトでアイテムを表示するビューが用意されていないため、選択状態もまた、自前実装が必要です。

やや、面倒とも言えますが、大体、最終的にはデフォルト状態では気がすまなくなるので、まー最初から考慮しながら進めるのも悪くないかも知れません。