Zobrazení osnovy v Xamarin.Mac

Tento článek popisuje práci se zobrazeními osnovy v aplikaci Xamarin.Mac. Popisuje vytváření a údržbu zobrazení osnovy v Xcode a Interface Builderu a pracuje s nimi programově.

Při práci s C# a .NET v aplikaci Xamarin.Mac máte přístup ke stejným zobrazením osnovy, ve kterých vývojář pracuje Objective-C , a Xcode . Vzhledem k tomu, že Xamarin.Mac se integruje přímo s Xcode, můžete pomocí Tvůrce rozhraní Xcode vytvářet a udržovat zobrazení osnovy (nebo je volitelně vytvářet přímo v kódu jazyka C#).

Zobrazení osnovy je typ tabulky, která umožňuje uživateli rozbalit nebo sbalit řádky hierarchických dat. Podobně jako zobrazení tabulky zobrazuje zobrazení osnovy data pro sadu souvisejících položek s řádky představujícími jednotlivé položky a sloupce představující atributy těchto položek. Na rozdíl od zobrazení tabulky nejsou položky v zobrazení osnovy v plochém seznamu uspořádané v hierarchii, jako jsou soubory a složky na pevném disku.

An example app run

V tomto článku se podíváme na základy práce se zobrazeními osnovy v aplikaci Xamarin.Mac. Důrazně doporučujeme nejprve projít si článek Hello, Mac , konkrétně úvod do Xcode a Interface Builder aOutlets and Actions oddíly, protože se zabývá klíčovými koncepty a technikami, které budeme používat v tomto článku.

Můžete se také podívat na třídy / metody pro zveřejnění kódu jazyka C# v Objective-C části dokumentu Interní dokumenty Xamarin.Mac , vysvětluje Register a Export příkazy používané k převodu tříd jazyka C# na Objective-C objekty a prvky uživatelského rozhraní.

Úvod do zobrazení osnovy

Zobrazení osnovy je typ tabulky, která umožňuje uživateli rozbalit nebo sbalit řádky hierarchických dat. Podobně jako zobrazení tabulky zobrazuje zobrazení osnovy data pro sadu souvisejících položek s řádky představujícími jednotlivé položky a sloupce představující atributy těchto položek. Na rozdíl od zobrazení tabulky nejsou položky v zobrazení osnovy v plochém seznamu uspořádané v hierarchii, jako jsou soubory a složky na pevném disku.

Pokud položka v zobrazení osnovy obsahuje další položky, může ji uživatel rozbalit nebo sbalit. Rozbalitelná položka zobrazuje vyzrazení trojúhelníku, který odkazuje vpravo, když je položka sbalená a když je položka rozbalená. Kliknutím na zpřístupňovací trojúhelník způsobí, že se položka rozbalí nebo sbalí.

Zobrazení osnovy (NSOutlineView) je podtřídou zobrazení tabulky (NSTableView) a jako takové dědí většinu jeho chování z nadřazené třídy. V důsledku toho mnoho operací podporovaných zobrazením tabulky, jako je výběr řádků nebo sloupců, změna umístění sloupců přetažením záhlaví sloupců atd., jsou podporovány také zobrazením osnovy. Aplikace Xamarin.Mac má kontrolu nad těmito funkcemi a může nakonfigurovat parametry zobrazení osnovy (v kódu nebo Tvůrci rozhraní) tak, aby povolovala nebo zakázala určité operace.

Zobrazení osnovy neukládá vlastní data, místo toho spoléhá na zdroj dat (NSOutlineViewDataSource) k poskytnutí požadovaných řádků i sloupců podle potřeby.

Chování zobrazení osnovy je možné přizpůsobit tak, že poskytuje podtřídu delegáta zobrazení osnovy (NSOutlineViewDelegate), který podporuje správu sloupců osnovy, typ pro výběr funkcí, výběr řádků a úpravy, vlastní sledování a vlastní zobrazení pro jednotlivé sloupce a řádky.

Vzhledem k tomu, že zobrazení osnovy sdílí většinu jeho chování a funkcí s zobrazením tabulky, můžete si před pokračováním v tomto článku projít naši dokumentaci k zobrazením tabulek .

Vytváření a údržba zobrazení osnovy v Xcode

Když vytvoříte novou aplikaci Xamarin.Mac Cocoa, ve výchozím nastavení získáte standardní prázdné okno. Tato okna jsou definována .storyboard v souboru automaticky zahrnuté v projektu. Pokud chcete upravit návrh oken, poklikejte v Průzkumník řešení na Main.storyboard soubor:

Selecting the main storyboard

Tím se otevře návrh okna v Tvůrci rozhraní Xcode:

Editing the UI in Xcode

Zadejte outline do vyhledávacího pole inspektoru knihovny , abyste usnadnili vyhledání ovládacích prvků Zobrazení osnovy:

Selecting an Outline View from the Library

Přetáhněte zobrazení osnovy na kontroler zobrazení v editoru rozhraní, zaplněte oblast obsahu kontroleru zobrazení a nastavte ho na místo, kam se zmenší a zvětší s oknem v Editoru omezení:

Editing the constraints

Vyberte zobrazení osnovy v hierarchii rozhraní a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available in the Attribute Inspector.

  • Sloupec osnovy – sloupec tabulky, ve kterém jsou zobrazena hierarchická data.
  • Automaticky ukládat sloupec osnovy – Pokud truese sloupec osnovy automaticky uloží a obnoví mezi spuštěním aplikace.
  • Odsazení – množství odsazení sloupců pod rozbalenou položkou
  • Odsazení následuje po buňkách – Pokud truese odsazení odsadí spolu s buňkami.
  • Automatické ukládání rozbalených položek – Pokud truese rozbalený nebo sbalený stav položek automaticky uloží a obnoví mezi spuštěním aplikace.
  • Režim obsahu – Umožňuje použít zobrazení () nebo buňky (NSViewNSCell) k zobrazení dat v řádcích a sloupcích. Počínaje macOS 10.7 byste měli používat zobrazení.
  • Floats Seskupuje řádky – Pokud true, bude zobrazení tabulky kreslit seskupené buňky, jako by byly plovoucí.
  • Sloupce – Definuje počet zobrazených sloupců.
  • Záhlaví – Pokud truesloupce budou obsahovat záhlaví.
  • Změna pořadí – Pokud true, uživatel bude moct přetáhnout sloupce v tabulce.
  • Změna velikosti – Pokud truebude uživatel moct přetáhnout záhlaví sloupců, aby změnil velikost sloupců.
  • Změna velikosti sloupců – Určuje, jak bude tabulka automaticky měnit velikost sloupců.
  • Zvýraznění – Určuje typ zvýraznění tabulky, která se používá při výběru buňky.
  • Alternativní řádky – Pokud true, někdy jiný řádek bude mít jinou barvu pozadí.
  • Vodorovná mřížka – vybere typ ohraničení nakresleného mezi buňkami vodorovně.
  • Svislá mřížka – vybere typ ohraničení nakresleného mezi buňkami svisle.
  • Barva mřížky – Nastaví barvu ohraničení buňky.
  • Pozadí – Nastaví barvu pozadí buňky.
  • Výběr – Umožňuje řídit, jak může uživatel vybrat buňky v tabulce jako:
    • Více – Pokud truemůže uživatel vybrat více řádků a sloupců.
    • Sloupec – Pokud trueuživatel může vybrat sloupce.
    • Typ Vybrat – Pokud truemůže uživatel zadat znak pro výběr řádku.
    • Prázdné – Pokud trueuživatel nemusí vybrat řádek nebo sloupec, tabulka neumožňuje vůbec žádný výběr.
  • Automatické ukládání – název, pod kterým se formát tabulek automaticky uloží.
  • Informace o sloupci – Pokud truese pořadí a šířka sloupců automaticky uloží.
  • Konce řádků – Vyberte, jak buňka zpracovává konce řádků.
  • Zkrátí poslední viditelnou čáru – pokud truese buňka zkrátí v datech, nemůže se vejít do hranic.

Důležité

Pokud nechováte starší verzi aplikace Xamarin.Mac, NSView měli byste použít zobrazení osnovy na NSCell základě zobrazení tabulek. NSCell je považováno za starší verzi a nemusí být podporováno v budoucnu.

Vyberte sloupec tabulky v hierarchii rozhraní a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available for the selected table column in the Attribute Inspector.

  • Název – Nastaví název sloupce.
  • Zarovnání – Nastavte zarovnání textu v buňkách.
  • Písmo nadpisu – Vybere písmo pro text záhlaví buňky.
  • Klíč řazení – je klíč použitý k řazení dat ve sloupci. Pokud uživatel nemůže tento sloupec seřadit, ponechejte prázdné.
  • Selektor – jedná se o akci použitou k provedení řazení. Pokud uživatel nemůže tento sloupec seřadit, ponechejte prázdné.
  • Pořadí – je pořadí řazení pro data sloupců.
  • Změna velikosti – Vybere typ změny velikosti sloupce.
  • Upravitelné – Pokud truemůže uživatel upravovat buňky v tabulce založené na buňce.
  • Skryté – Pokud trueje sloupec skrytý.

Můžete také změnit velikost sloupce přetažením úchytu (svisle na střed na pravé straně sloupce) doleva nebo doprava.

Pojďme vybrat každý sloupec v našem zobrazení tabulky a dát první sloupec názevProduct a druhý sloupec Details.

V hierarchii rozhraní vyberte zobrazení buněk tabulky (NSTableViewCell) a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available for the selected table cell in the Attribute Inspector.

Jedná se o všechny vlastnosti standardního zobrazení. Tady máte také možnost změnit velikost řádků pro tento sloupec.

Vyberte buňku zobrazení tabulky (ve výchozím nastavení je to NSTextField) v hierarchii rozhraní a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available for the selected table view cell in the Attribute Inspector.

Budete mít všechny vlastnosti standardního textového pole, které se tady nastaví. Ve výchozím nastavení se standardní textové pole používá k zobrazení dat pro buňku ve sloupci.

V hierarchii rozhraní vyberte zobrazení buněk tabulky (NSTableFieldCell) a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available for the selected table view cell.

Nejdůležitější nastavení jsou:

  • Rozložení – Vyberte způsob rozložení buněk v tomto sloupci.
  • Používá režim jednořádkového řádku – Pokud trueje buňka omezena na jeden řádek.
  • První šířka rozložení modulu runtime – Pokud truebude buňka upřednostňovat šířku nastavenou (buď ručně, nebo automaticky), když se zobrazí při prvním spuštění aplikace.
  • Akce – určuje, kdy se pro buňku odešle akce pro úpravy.
  • Chování – definuje, jestli je buňka vybratelná nebo upravitelná.
  • Formátovaný text – Pokud truemůže buňka zobrazit formátovaný a stylovaný text.
  • Zpět - Pokud truebuňka přebírá odpovědnost za chování zpět.

Vyberte zobrazení buněk tabulky (NSTableFieldCell) v dolní části sloupce tabulky v hierarchii rozhraní:

Selecting the table cell view

To umožňuje upravit zobrazení buňky tabulky použité jako základní vzor pro všechny buňky vytvořené pro daný sloupec.

Přidání akcí a zásuvek

Stejně jako u jakéhokoli jiného ovládacího prvku Cocoa UI musíme vystavit zobrazení osnovy a je to sloupce a buňky kódu jazyka C# pomocí akcí a výstupů (na základě požadovaných funkcí).

Proces je stejný pro libovolný prvek zobrazení osnovy, který chceme zpřístupnit:

  1. Přepněte do Editoru asistentů a ujistěte se, že ViewController.h je soubor vybraný:

    Selecting the correct .h file

  2. V hierarchii rozhraní vyberte zobrazení osnovy, klikněte na ovládací prvek a přetáhněte ho ViewController.h do souboru.

  3. Vytvořte zásuvku pro zobrazení osnovy s názvem ProductOutline:

    Screenshot shows an Outlet called ProductOutline in the Attribute Inspector.

  4. Vytvořte zásuvky pro sloupce tabulek a také volejte ProductColumn a DetailsColumn:

    Screenshot shows an Outlet named DetailsColumn in the Attribute Inspector.

  5. Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

V dalším kroku napíšeme kód, který zobrazí některá data pro osnovu při spuštění aplikace.

Naplnění zobrazení osnovy

S naším zobrazením osnovy navrženým v Tvůrci rozhraní a vystaveným prostřednictvím zásuvky musíme vytvořit kód jazyka C#, který ho naplní.

Nejprve vytvoříme novou Product třídu, která bude obsahovat informace pro jednotlivé řádky a skupiny dílčích produktů. V Průzkumník řešení klikněte pravým tlačítkem na Project a vyberte Přidat>nový soubor... Vyberte GeneralEmpty> Class, zadejte Productnázev a klikněte na tlačítko Nový:

Creating an empty class

Product.cs Vzhled souboru vypadá takto:

using System;
using Foundation;
using System.Collections.Generic;

namespace MacOutlines
{
    public class Product : NSObject
    {
        #region Public Variables
        public List<Product> Products = new List<Product>();
        #endregion

        #region Computed Properties
        public string Title { get; set;} = "";
        public string Description { get; set;} = "";
        public bool IsProductGroup {
            get { return (Products.Count > 0); }
        }
        #endregion

        #region Constructors
        public Product ()
        {
        }

        public Product (string title, string description)
        {
            this.Title = title;
            this.Description = description;
        }
        #endregion
    }
}

Dále musíme vytvořit podtřídu NSOutlineDataSource pro poskytnutí dat pro osnovu, jak je požadováno. V Průzkumník řešení klikněte pravým tlačítkem na Project a vyberte Přidat>nový soubor... Vyberte GeneralEmpty> Class, zadejte ProductOutlineDataSourcenázev a klikněte na tlačítko Nový.

ProductTableDataSource.cs Upravte soubor a udělejte ho takto:

using System;
using AppKit;
using CoreGraphics;
using Foundation;
using System.Collections;
using System.Collections.Generic;

namespace MacOutlines
{
    public class ProductOutlineDataSource : NSOutlineViewDataSource
    {
        #region Public Variables
        public List<Product> Products = new List<Product>();
        #endregion

        #region Constructors
        public ProductOutlineDataSource ()
        {
        }
        #endregion

        #region Override Methods
        public override nint GetChildrenCount (NSOutlineView outlineView, NSObject item)
        {
            if (item == null) {
                return Products.Count;
            } else {
                return ((Product)item).Products.Count;
            }

        }

        public override NSObject GetChild (NSOutlineView outlineView, nint childIndex, NSObject item)
        {
            if (item == null) {
                return Products [childIndex];
            } else {
                return ((Product)item).Products [childIndex];
            }

        }

        public override bool ItemExpandable (NSOutlineView outlineView, NSObject item)
        {
            if (item == null) {
                return Products [0].IsProductGroup;
            } else {
                return ((Product)item).IsProductGroup;
            }

        }
        #endregion
    }
}

Tato třída má úložiště pro položky zobrazení osnovy GetChildrenCount a přepíše, aby vrátil počet řádků v tabulce. Vrátí GetChild konkrétní nadřazenou nebo podřízenou položku (podle požadavku zobrazení osnovy) a ItemExpandable definuje zadanou položku jako nadřazenou nebo podřízenou položku.

Nakonec musíme vytvořit podtřídu NSOutlineDelegate , abychom zajistili chování osnovy. V Průzkumník řešení klikněte pravým tlačítkem na Project a vyberte Přidat>nový soubor... Vyberte GeneralEmpty> Class, zadejte ProductOutlineDelegatenázev a klikněte na tlačítko Nový.

ProductOutlineDelegate.cs Upravte soubor a udělejte ho takto:

using System;
using AppKit;
using CoreGraphics;
using Foundation;
using System.Collections;
using System.Collections.Generic;

namespace MacOutlines
{
    public class ProductOutlineDelegate : NSOutlineViewDelegate
    {
        #region Constants
        private const string CellIdentifier = "ProdCell";
        #endregion

        #region Private Variables
        private ProductOutlineDataSource DataSource;
        #endregion

        #region Constructors
        public ProductOutlineDelegate (ProductOutlineDataSource datasource)
        {
            this.DataSource = datasource;
        }
        #endregion

        #region Override Methods

        public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) {
            // This pattern allows you reuse existing views when they are no-longer in use.
            // If the returned view is null, you instance up a new view
            // If a non-null view is returned, you modify it enough to reflect the new data
            NSTextField view = (NSTextField)outlineView.MakeView (CellIdentifier, this);
            if (view == null) {
                view = new NSTextField ();
                view.Identifier = CellIdentifier;
                view.BackgroundColor = NSColor.Clear;
                view.Bordered = false;
                view.Selectable = false;
                view.Editable = false;
            }

            // Cast item
            var product = item as Product;

            // Setup view based on the column selected
            switch (tableColumn.Title) {
            case "Product":
                view.StringValue = product.Title;
                break;
            case "Details":
                view.StringValue = product.Description;
                break;
            }

            return view;
        }
        #endregion
    }
}

Když vytvoříme instanci objektu ProductOutlineDelegate, předáme také instanci ProductOutlineDataSource , která poskytuje data pro osnovu. Tato GetView metoda zodpovídá za vrácení zobrazení (dat) k zobrazení buňky pro sloupec a řádek. Pokud je to možné, existující zobrazení se znovu použije k zobrazení buňky, pokud ne nové zobrazení musí být vytvořeno.

Pokud chcete osnovu naplnit, pojďme soubor upravit MainWindow.cs a nastavit, aby AwakeFromNib metoda vypadala takto:

public override void AwakeFromNib ()
{
    base.AwakeFromNib ();

    // Create data source and populate
    var DataSource = new ProductOutlineDataSource ();

    var Vegetables = new Product ("Vegetables", "Greens and Other Produce");
    Vegetables.Products.Add (new Product ("Cabbage", "Brassica oleracea - Leaves, axillary buds, stems, flowerheads"));
    Vegetables.Products.Add (new Product ("Turnip", "Brassica rapa - Tubers, leaves"));
    Vegetables.Products.Add (new Product ("Radish", "Raphanus sativus - Roots, leaves, seed pods, seed oil, sprouting"));
    Vegetables.Products.Add (new Product ("Carrot", "Daucus carota - Root tubers"));
    DataSource.Products.Add (Vegetables);

    var Fruits = new Product ("Fruits", "Fruit is a part of a flowering plant that derives from specific tissues of the flower");
    Fruits.Products.Add (new Product ("Grape", "True Berry"));
    Fruits.Products.Add (new Product ("Cucumber", "Pepo"));
    Fruits.Products.Add (new Product ("Orange", "Hesperidium"));
    Fruits.Products.Add (new Product ("Blackberry", "Aggregate fruit"));
    DataSource.Products.Add (Fruits);

    var Meats = new Product ("Meats", "Lean Cuts");
    Meats.Products.Add (new Product ("Beef", "Cow"));
    Meats.Products.Add (new Product ("Pork", "Pig"));
    Meats.Products.Add (new Product ("Veal", "Young Cow"));
    DataSource.Products.Add (Meats);

    // Populate the outline
    ProductOutline.DataSource = DataSource;
    ProductOutline.Delegate = new ProductOutlineDelegate (DataSource);

}

Pokud aplikaci spustíme, zobrazí se následující:

The collapsed view

Pokud uzel rozbalíme v zobrazení osnovy, bude vypadat takto:

The expanded view

Řazení podle sloupce

Umožníme uživateli řadit data v osnově kliknutím na záhlaví sloupce. Nejprve poklikáním na Main.storyboard soubor otevřete soubor pro úpravy v Tvůrci rozhraní. Product Vyberte sloupec, zadejte Title pro klíč řazení, compare: pro selektor a vyberte Ascendingpořadí:

Setting the sort key order

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Teď soubor upravíme ProductOutlineDataSource.cs a přidáme následující metody:

public void Sort(string key, bool ascending) {

    // Take action based on key
    switch (key) {
    case "Title":
        if (ascending) {
            Products.Sort ((x, y) => x.Title.CompareTo (y.Title));
        } else {
            Products.Sort ((x, y) => -1 * x.Title.CompareTo (y.Title));
        }
        break;
    }
}

public override void SortDescriptorsChanged (NSOutlineView outlineView, NSSortDescriptor[] oldDescriptors)
{
    // Sort the data
    Sort (oldDescriptors [0].Key, oldDescriptors [0].Ascending);
    outlineView.ReloadData ();
}

Metoda Sort nám umožňuje seřadit data ve zdroji dat na základě daného Product pole třídy ve vzestupném nebo sestupném pořadí. SortDescriptorsChanged Přepsáná metoda bude volána pokaždé, když použijete kliknutí na záhlaví sloupce. Předá se hodnota Klíče , kterou jsme nastavili v Tvůrci rozhraní, a pořadí řazení pro daný sloupec.

Pokud aplikaci spustíme a klikneme na záhlaví sloupců, řádky se seřadí podle daného sloupce:

Example of sorted output

Výběr řádku

Pokud chcete uživateli povolit výběr jednoho řádku, poklikejte na soubor a otevřete ho Main.storyboard pro úpravy v Tvůrci rozhraní. Vyberte zobrazení osnovy v hierarchii rozhraní a zrušte zaškrtnutí políčka Více v inspektoru atributů:

Screenshot shows the Attribute Inspector where you can change the Multiple setting.

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Dále upravte ProductOutlineDelegate.cs soubor a přidejte následující metodu:

public override bool ShouldSelectItem (NSOutlineView outlineView, NSObject item)
{
    // Don't select product groups
    return !((Product)item).IsProductGroup;
}

To uživateli umožní vybrat libovolný jeden řádek v zobrazení osnovy. Vraťte false se pro ShouldSelectItem libovolnou položku, kterou nechcete, aby uživatel mohl vybrat nebo false pro každou položku, pokud nechcete, aby uživatel mohl vybrat žádné položky.

Výběr více řádků

Pokud chcete uživateli povolit výběr více řádků, poklikejte na soubor a otevřete ho Main.storyboard pro úpravy v Tvůrci rozhraní. Vyberte zobrazení osnovy v hierarchii rozhraní a zaškrtněte políčko Více v inspektoru atributů:

Screenshot shows the Attribute Inspector where you can select Multiple.

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Dále upravte ProductOutlineDelegate.cs soubor a přidejte následující metodu:

public override bool ShouldSelectItem (NSOutlineView outlineView, NSObject item)
{
    // Don't select product groups
    return !((Product)item).IsProductGroup;
}

To uživateli umožní vybrat libovolný jeden řádek v zobrazení osnovy. Vraťte false se pro ShouldSelectRow libovolnou položku, kterou nechcete, aby uživatel mohl vybrat nebo false pro každou položku, pokud nechcete, aby uživatel mohl vybrat žádné položky.

Typ pro výběr řádku

Pokud chcete uživateli povolit zadat znak s vybraným zobrazením osnovy a vybrat první řádek s tímto znakem, poklikejte na soubor a otevřete ho Main.storyboard pro úpravy v Tvůrci rozhraní. Vyberte zobrazení osnovy v hierarchii rozhraní a zaškrtněte políčko Vybrat typ v inspektoru atributů:

Editing the row type

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Teď soubor upravíme ProductOutlineDelegate.cs a přidáme následující metodu:

public override NSObject GetNextTypeSelectMatch (NSOutlineView outlineView, NSObject startItem, NSObject endItem, string searchString)
{
    foreach(Product product in DataSource.Products) {
        if (product.Title.Contains (searchString)) {
            return product;
        }
    }

    // Not found
    return null;
}

Metoda GetNextTypeSelectMatch vezme danou searchString a vrátí položku první Product , která má tento řetězec v něm Title.

Změna pořadí sloupců

Pokud chcete uživateli povolit přeuspořádání sloupců v zobrazení osnovy, poklikejte na soubor a otevřete ho Main.storyboard pro úpravy v Tvůrci rozhraní. Vyberte zobrazení osnovy v hierarchii rozhraní a zaškrtněte políčko Změnit pořadí v inspektoru atributů:

Screenshot shows the Attribute Inspector where you can select Reordering.

Pokud zadáme hodnotu vlastnosti Automatické ukládání a zkontrolujeme pole Informace o sloupci , všechny změny provedené v rozložení tabulky se automaticky uloží pro nás a obnoví se při příštím spuštění aplikace.

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Teď soubor upravíme ProductOutlineDelegate.cs a přidáme následující metodu:

public override bool ShouldReorder (NSOutlineView outlineView, nint columnIndex, nint newColumnIndex)
{
    return true;
}

Metoda ShouldReorder by měla vrátit true pro libovolný sloupec, který chce povolit přetáhnout newColumnIndexdo , jinak vrátit false;

Pokud spustíme aplikaci, můžeme přetáhnout záhlaví sloupců a změnit pořadí sloupců:

Example of reordering columns

Úpravy buněk

Pokud chcete uživateli povolit úpravy hodnot pro danou buňku, upravte ProductOutlineDelegate.cs soubor a změňte metodu GetViewForItem následujícím způsobem:

public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) {
    // Cast item
    var product = item as Product;

    // This pattern allows you reuse existing views when they are no-longer in use.
    // If the returned view is null, you instance up a new view
    // If a non-null view is returned, you modify it enough to reflect the new data
    NSTextField view = (NSTextField)outlineView.MakeView (tableColumn.Title, this);
    if (view == null) {
        view = new NSTextField ();
        view.Identifier = tableColumn.Title;
        view.BackgroundColor = NSColor.Clear;
        view.Bordered = false;
        view.Selectable = false;
        view.Editable = !product.IsProductGroup;
    }

    // Tag view
    view.Tag = outlineView.RowForItem (item);

    // Allow for edit
    view.EditingEnded += (sender, e) => {

        // Grab product
        var prod = outlineView.ItemAtRow(view.Tag) as Product;

        // Take action based on type
        switch(view.Identifier) {
        case "Product":
            prod.Title = view.StringValue;
            break;
        case "Details":
            prod.Description = view.StringValue;
            break;
        }
    };

    // Setup view based on the column selected
    switch (tableColumn.Title) {
    case "Product":
        view.StringValue = product.Title;
        break;
    case "Details":
        view.StringValue = product.Description;
        break;
    }

    return view;
}

Když teď aplikaci spustíme, může uživatel upravit buňky v zobrazení tabulky:

An example of editing cells

Použití obrázků v zobrazeních osnovy

Chcete-li do buňky zahrnout obrázek jako součást buňky NSOutlineView, budete muset změnit způsob vrácení dat metodou Zobrazení NSTableViewDelegate'sGetView osnovy, aby NSTableCellView místo typického NSTextField. Příklad:

public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) {
    // Cast item
    var product = item as Product;

    // This pattern allows you reuse existing views when they are no-longer in use.
    // If the returned view is null, you instance up a new view
    // If a non-null view is returned, you modify it enough to reflect the new data
    NSTableCellView view = (NSTableCellView)outlineView.MakeView (tableColumn.Title, this);
    if (view == null) {
        view = new NSTableCellView ();
        if (tableColumn.Title == "Product") {
            view.ImageView = new NSImageView (new CGRect (0, 0, 16, 16));
            view.AddSubview (view.ImageView);
            view.TextField = new NSTextField (new CGRect (20, 0, 400, 16));
        } else {
            view.TextField = new NSTextField (new CGRect (0, 0, 400, 16));
        }
        view.TextField.AutoresizingMask = NSViewResizingMask.WidthSizable;
        view.AddSubview (view.TextField);
        view.Identifier = tableColumn.Title;
        view.TextField.BackgroundColor = NSColor.Clear;
        view.TextField.Bordered = false;
        view.TextField.Selectable = false;
        view.TextField.Editable = !product.IsProductGroup;
    }

    // Tag view
    view.TextField.Tag = outlineView.RowForItem (item);

    // Allow for edit
    view.TextField.EditingEnded += (sender, e) => {

        // Grab product
        var prod = outlineView.ItemAtRow(view.Tag) as Product;

        // Take action based on type
        switch(view.Identifier) {
        case "Product":
            prod.Title = view.TextField.StringValue;
            break;
        case "Details":
            prod.Description = view.TextField.StringValue;
            break;
        }
    };

    // Setup view based on the column selected
    switch (tableColumn.Title) {
    case "Product":
        view.ImageView.Image = NSImage.ImageNamed (product.IsProductGroup ? "tags.png" : "tag.png");
        view.TextField.StringValue = product.Title;
        break;
    case "Details":
        view.TextField.StringValue = product.Description;
        break;
    }

    return view;
}

Další informace najdete v části Používání obrázků se zobrazením osnovy v naší dokumentaci k práci s obrázky .

Zobrazení osnovy datové vazby

Pomocí technik kódování a datových vazeb v aplikaci Xamarin.Mac pomocí Key-Value kódu můžete výrazně snížit množství kódu, který potřebujete k psaní a údržbě k naplnění a práci s prvky uživatelského rozhraní. Výhodou je také další oddělení backingových dat (datový model) od uživatelského rozhraní front-endu (Model-View-Controller), což usnadňuje údržbu a flexibilnější návrh aplikací.

Key-Value Kódování (KVC) je mechanismus pro přístup k vlastnostem objektu nepřímo pomocí klíčů (speciálně formátovaných řetězců) k identifikaci vlastností místo přístupu k nim prostřednictvím proměnných instancí nebo metod příslušenství (get/set). Implementací Key-Value přístupových objektů kompatibilních s kódováním v aplikaci Xamarin.Mac získáte přístup k dalším funkcím macOS, jako jsou Key-Value Observing (KVO), Datové vazby, Základní data, vazby Cocoa a skriptovatelnost.

Další informace najdete v části Datové vazby zobrazení osnovy v dokumentaci k datovým vazbě a Key-Value kódování .

Souhrn

Tento článek se podrobně podíval na práci se zobrazeními osnovy v aplikaci Xamarin.Mac. Viděli jsme různé typy a použití zobrazení osnovy, jak vytvářet a udržovat zobrazení osnovy v Tvůrci rozhraní Xcode a jak pracovat se zobrazeními osnovy v kódu jazyka C#.