Zobrazení osnovy v Xamarin. Mac

Tento článek popisuje práci se zobrazeními osnovy v aplikaci Xamarin. Mac. Popisuje vytváření a správu zobrazení osnovy v Xcode a Interface Builder a práci s nimi prostřednictvím kódu programu.

Při práci s C# a .NET v aplikaci Xamarin. Mac máte přístup ke stejným zobrazením osnovy, která vývojář pracuje v Objective-C a Objective-C . Protože se Xamarin. Mac integruje přímo s Xcode, můžete použít Interface Builder Xcode k vytváření a údržbě zobrazení osnovy (nebo je případně můžete vytvořit přímo v kódu C#).

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

Příklad spuštění aplikace

V tomto článku se seznámíte se základy práce se zobrazeními osnovy v aplikaci Xamarin. Mac. Důrazně doporučujeme, abyste nejprve pracovali v článku Hello, Mac , konkrétně v částech Úvod k Xcode a Interface Builder a akcím a akcím , které se týkají klíčových konceptů a technik, které v tomto článku budeme používat.

Můžete se podívat i na část dokumentu s dalšími Exposing C# classes / methods to Objective-CExposing C# classes / methods to Objective-C a vysvětluje RegisterExport příkazy a používané k navýšení tříd jazyka C# do Objective-C objektů a prvků uživatelského rozhraní.

Seznámení se zobrazeními osnovy

Zobrazení osnovy je typ tabulky, která umožňuje uživateli rozbalit nebo sbalit řádky hierarchických dat. Podobně jako v tabulkovém zobrazení zobrazuje osnova zobrazení dat pro sadu souvisejících položek s řádky, které představují jednotlivé položky a sloupce reprezentující atributy těchto položek. Na rozdíl od tabulkového zobrazení nejsou položky v zobrazení osnovy v nestrukturovaném seznamu uspořádány 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. Rozšiřitelná položka zobrazuje trojúhelník, který odkazuje na pravé, pokud je položka sbalená a když je položka rozbalená, ukáže dolů. Kliknutím na vyzrazení trojúhelník způsobí, že se položka rozbalí nebo sbalí.

Zobrazení Osnova ( NSOutlineView ) je podtřídou tabulkového zobrazení ( NSTableView ) a jako takové dědí většinu chování z nadřazené třídy. V důsledku toho mnoho operací podporovaných tabulkovým zobrazením, jako je například výběr řádků nebo sloupců, mění umístění sloupců přetažením záhlaví sloupců atd. je podporováno také zobrazením osnovy. Aplikace Xamarin. Mac má kontrolu nad těmito funkcemi a může nakonfigurovat parametry zobrazení osnovy (buď v kódu, nebo Interface Builder) a povolit nebo zakázat určité operace.

Zobrazení osnovy neukládá vlastní data, místo toho se spoléhá na zdroj dat ( NSOutlineViewDataSource ), který poskytuje požadované řádky a sloupce podle potřeby.

Chování zobrazení osnovy lze přizpůsobit poskytnutím podtřídy delegáta zobrazení osnovy ( NSOutlineViewDelegate ) pro podporu správy sloupců s přehledem, typu a výběru funkcí, výběru řádků a úprav, vlastním sledováním a vlastních zobrazení pro jednotlivé sloupce a řádky.

Vzhledem k tomu, že zobrazení osnovy sdílí většinu chování a funkcí v tabulkovém zobrazení, možná budete chtít před pokračováním v tomto článku projít dokumentaci k zobrazením tabulky .

Vytváření a správa zobrazení osnovy v Xcode

Když vytvoříte novou aplikaci Xamarin. Mac kakaa, ve výchozím nastavení se zobrazí standardní prázdné okno. Tato okna jsou definována v souboru, který je .storyboard automaticky zahrnutý v projektu. Chcete-li upravit návrh systému Windows, v Průzkumník řešenídvakrát klikněte na soubor:

Výběr hlavního scénáře

Tím se otevře návrh okna Interface Builder Xcode:

Úprava uživatelského rozhraní v Xcode

Zadejte outline do vyhledávacího pole v outline , aby bylo snazší najít ovládací prvky zobrazení osnovy:

Výběr zobrazení osnovy z knihovny

Přetáhněte zobrazení Osnova do kontroleru zobrazení v editoru rozhraní, vyplněním oblasti obsahu kontroleru zobrazení a jeho nastavením na místo, kde se zmenší a rozroste pomocí okna v editoru omezení:

Úprava omezení

V hierarchii rozhraní vyberte zobrazení Osnova a v inspektoru atributůjsou k dispozici následující vlastnosti:

Snímek obrazovky zobrazuje vlastnosti, které jsou k dispozici v inspektoru atributů.

  • Osnova – sloupec tabulky, ve kterém se zobrazují hierarchická data
  • Automatické ukládání – sloupec osnovy – Pokud se sloupec s osnovou automaticky uloží a obnoví mezi spuštěním aplikace.
  • Odsazení – velikost pro odsazení sloupců v rozbalené položce
  • Odsazení sleduje buňky – Pokud bude značka odsazení odsazená spolu s buňkami.
  • Automatické ukládání rozbalených položek – Pokud se stav rozbalené nebo sbalené položky automaticky uloží a obnoví mezi spuštěním aplikace.
  • Režim obsahu – umožňuje použít buď zobrazení ( ), nebo buňky ( NSCell ) k zobrazení dat v řádcích a sloupcích. Od macOS 10,7 byste měli použít zobrazení.
  • Nastaví Řádky skupiny – Pokud je v zobrazení tabulka nakreslené buňky seskupené, jako kdyby byly plovoucí.
  • Sloupce – definuje počet zobrazených sloupců.
  • Hlavičky – Pokud budou mít sloupce záhlaví.
  • Změna pořadí – Pokud bude uživatel moci přeuspořádat sloupce v tabulce.
  • Změna velikosti – Pokud bude uživatel moct přetahovat záhlaví sloupců, aby se změnila velikost sloupců.
  • Změna velikosti sloupce – určuje, jak bude tabulka automaticky měnit velikost sloupců.
  • Zvýraznění – určuje typ zvýraznění tabulky používané při výběru buňky.
  • Alternativní řádky – Pokud má jiný řádek jinou barvu pozadí.
  • Vodorovná mřížka – vybere typ ohraničení vykresleného mezi buňkami vodorovně.
  • Svislá mřížka – vybere typ ohraničení vykresleného mezi buňkami svisle.
  • Grid Color – nastaví barvu ohraničení buňky.
  • Background – 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 uživatel může vybrat více řádků a sloupců.
    • Sloupec – Pokud uživatel může vybrat sloupce.
    • Typ Select – Pokud uživatel může zadat znak pro výběr řádku.
    • Prázdné – Pokud uživatel nepožaduje, aby vybral řádek nebo sloupec, neumožňuje v tabulce žádný výběr.
  • Automatické ukládání – název, ve kterém se formát tabulek ukládá, se automaticky uloží.
  • Informace o sloupci – Pokud se bude automaticky ukládat pořadí a šířka sloupců.
  • Konce řádků – vyberte způsob, jakým buňka zpracovává zalomení řádků.
  • Zkrátí poslední viditelné řádky – Pokud by se buňka zkrátila v datech, která se nevejdou do hranic.

Důležité

Pokud neuchováváte starší verzi aplikace Xamarin. Mac, je NSView třeba použít zobrazení osnovy na základě NSCell tabulkových zobrazení. NSCell se považuje za starší verzi a nemusí být podporovaná, až dál.

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

Snímek obrazovky zobrazuje vlastnosti, které jsou k dispozici pro vybraný sloupec tabulky v inspektoru atributů.

  • Title – nastaví název sloupce.
  • Zarovnání – nastaví zarovnání textu v buňkách.
  • Písmo názvu – vybere písmo pro text záhlaví buňky.
  • Klíč řazení – je klíč používaný k řazení dat ve sloupci. Pokud uživatel nemůže tento sloupec seřadit, ponechte prázdné.
  • Selektor – jedná se o akci , která se používá k provedení řazení. Pokud uživatel nemůže tento sloupec seřadit, ponechte prázdné.
  • Order – je pořadím řazení pro data sloupců.
  • Změna velikosti – vybere typ změny velikosti sloupce.
  • Upravitelné – Pokud může uživatel upravovat buňky v tabulce založené na buňkách.
  • Skryté – Pokud je sloupec skrytý.

Velikost sloupce můžete změnit také tak, že přetáhnete jeho úchyt (svisle na pravé straně na pravé straně sloupce) vlevo nebo vpravo.

Pojďme vybrat každý sloupec v našem zobrazení tabulky a zadat název prvního sloupce a druhý Details .

Vyberte v hierarchii rozhraní zobrazení buňky tabulky ( NSTableViewCell ) NSTableViewCell a v inspektoru atributůjsou k dispozici následující vlastnosti:

Snímek obrazovky zobrazuje vlastnosti, které jsou k dispozici pro vybranou buňku tabulky v inspektoru atributů.

Jedná se o všechny vlastnosti standardního zobrazení. V tomto sloupci máte také možnost změnit velikost řádků.

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

Snímek obrazovky zobrazuje vlastnosti dostupné pro vybranou buňku zobrazení tabulky v inspektoru atributů.

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

Vyberte v hierarchii rozhraní zobrazení buňky tabulky ( NSTableFieldCell ) NSTableFieldCell a v inspektoru atributůjsou k dispozici následující vlastnosti:

Snímek obrazovky zobrazuje vlastnosti, které jsou k dispozici pro vybranou buňku zobrazení tabulky.

Nejdůležitější nastavení najdete tady:

  • Rozložení – vyberte, jak mají být buňky v tomto sloupci rozloženy.
  • Používá režim single line – Pokud je buňka omezená na jeden řádek.
  • Šířka rozložení prvního modulu runtime – Pokud se zobrazí při prvním spuštění aplikace, bude buňka preferovat šířku nastavenou buď ručně, nebo automaticky.
  • Akce – určuje, kdy se pro buňku odesílá akce Upravit.
  • Chování – Definuje, jestli je možné vybrat nebo upravit buňku.
  • Formátovaný text – Pokud , může buňka zobrazit formátovaný text se stylem.
  • Zpět – pokud buňka přebírá zodpovědnost za chování při vrácení zpět.

Vyberte Zobrazení buňky tabulky ( ) v NSTableFieldCell dolní části sloupce tabulky v NSTableFieldCell:

Výběr zobrazení buňky tabulky

To vám umožní 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 výstupů

Stejně jako u všech ostatních ovládacích prvků uživatelského rozhraní Cocoa musíme zobrazení obrysu a jeho sloupce a buňky zveřejnit v 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 zveřejnit:

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

    Výběr správného souboru .h

  2. V hierarchii rozhraní vyberte Zobrazení osnovy,klikněte na něj a přetáhněte ho do souboru.

  3. Vytvořte výstup pro zobrazení obrysu s názvem :

    Snímek obrazovky ukazuje výstup s názvem ProductOutline v inspektoru atributů.

  4. Vytvořte výstupy pro sloupce tabulek a také s názvem a DetailsColumn :

    Snímek obrazovky ukazuje výstup s názvem DetailsColumn v inspektoru atributů.

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

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

Naplnění zobrazení osnovy

S naším zobrazením obrysu navrženým Interface Builder a zveřejněným přes zásuvku musímedále vytvořit kód jazyka C#, který ho naplní.

Nejprve vytvoříme novou třídu, která bude obsahovat informace pro jednotlivé řádky a Product skupiny dílčích produktů. V Průzkumník řešeníklikněte pravým tlačítkem na ikonu Project vyberte Přidatnový soubor... Vyberte Obecná prázdná třída, jako Název zadejte a klikněte na tlačítko Nová:

Vytvoření prázdné třídy

Aby Product.cs soubor vypadal 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 , která bude na vyžádání poskytovat data pro NSOutlineDataSource osnovu. V Průzkumník řešeníklikněte pravým tlačítkem na ikonu Project vyberte Přidatnový soubor... Vyberte Obecná prázdná třída, jako Název zadejte a klikněte na tlačítko Nová.

Upravte ProductTableDataSource.cs soubor tak, aby vypadal 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 našeho zobrazení osnovy a přepisuje , aby se vrátil GetChildrenCount počet řádků v tabulce. Vrátí konkrétní nadřazenou nebo nadřazenou položku (podle požadavku zobrazení osnovy) a definuje zadanou položku jako nadřazenou nebo GetChildItemExpandable podřízený.

Nakonec musíme vytvořit podtřídu třídy , která NSOutlineDelegate bude poskytovat chování osnovy. V Průzkumník řešeníklikněte pravým tlačítkem na ikonu Project vyberte Přidatnový soubor... Vyberte Obecná prázdná třída, jako Název zadejte a klikněte na tlačítko Nová.

Upravte ProductOutlineDelegate.cs soubor tak, aby vypadal 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 , předáme také instanci objektu ProductOutlineDelegate , která poskytuje data pro ProductOutlineDataSource osnovu. Metoda zodpovídá za vrácení zobrazení (dat) pro zobrazení buňky pro GetView sloupec a řádek give. Pokud je to možné, existující zobrazení se znovu použije k zobrazení buňky. Pokud ne, musí se vytvořit nové zobrazení.

Pokud chcete obrys naplnit, upravte soubor a nakreslte metodu MainWindow.csAwakeFromNib 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 toto:

Sbalené zobrazení

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

Rozbalené zobrazení

Řazení podle sloupce

Umožňujeme uživateli seřadit data v osnově kliknutím na Záhlaví sloupce. Nejprve poklikejte na Main.storyboard soubor a otevřete ho pro úpravy v Interface Builder. Vyberte Product sloupec, jako Klíč pro řazení zadejte a jako TitleProductcompare:Title vyberte Ascendingcompare::

Nastavení pořadí klíčů řazení

Uložte změny a vraťte se do Visual Studio pro Mac 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 nám umožňuje seřadit data ve zdroji dat na základě pole dané třídy ve vzestupném SortProduct nebo sestupném pořadí. Přepsané SortDescriptorsChanged metody budou volány pokaždé, když použití klikne na záhlaví sloupce. Bude předána hodnota Klíč, kterou jsme nastavili v Interface Builder a pořadí řazení pro tento sloupec.

Pokud aplikaci spustíme a klikneme na Záhlaví sloupců, řádky se seřadí podle tohoto sloupce:

Příklad seřazených výstupů

Výběr řádku

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

Snímek obrazovky znázorňuje inspektor atributů, kde můžete změnit nastavení Více.

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

Dále upravte soubor ProductOutlineDelegate.cs 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ý řádek v zobrazení osnovy. Pokud nechcete, aby uživatel mohl vybrat položky, vraťte se k položce , kterou uživatel může vybrat, nebo pro každou falseShouldSelectItemfalse položku.

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

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

Snímek obrazovky znázorňuje inspektor atributů, kde můžete vybrat Více.

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

Dále upravte soubor ProductOutlineDelegate.cs 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ý řádek v zobrazení osnovy. Pokud nechcete, aby uživatel mohl vybrat položky, vraťte se k položce , kterou uživatel může vybrat, nebo pro každou falseShouldSelectRowfalse položku.

Výběr řádku výběrem možnosti Typ

Pokud chcete uživateli povolit zadat znak s vybraným zobrazením obrysu a vybrat první řádek, který má tento znak, poklikejte na soubor a otevřete ho pro úpravy v Main.storyboard Interface Builder. V hierarchii rozhraní vyberte zobrazení obrysu a v inspektoru atributů zaškrtněte políčko Vybrat typ:

Úprava typu řádku

Uložte změny a vraťte se do Visual Studio pro Mac 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 hodnotu a vrátí položku prvního, který obsahuje tento řetězec v searchString objektu ProductTitle .

Změna pořadí sloupců

Pokud chcete uživateli povolit přetahování sloupců v zobrazení osnovy, dvojím kliknutím na soubor ho otevřete pro úpravy v Main.storyboard Interface Builder. V hierarchii rozhraní vyberte zobrazení obrysu a v inspektoru atributů zaškrtněte políčko Změnit pořadí:

Snímek obrazovky s inspektorem atributů, kde můžete vybrat Změnit pořadí

Pokud zadají hodnotu vlastnosti Automatické ukládání a zaškrtnoume pole Informace o sloupci, všechny změny, které v rozložení tabulky uděláme, se automaticky uloží a obnoví při příštím spuštění aplikace.

Uložte změny a vraťte se do Visual Studio pro Mac 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 by měla vrátit všechny sloupce, u kterého chce povolit přeuspořádat do ShouldReordertrue , jinak vrátí newColumnIndexfalse ;

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

Příklad přeuspořádání sloupců

Úpravy buněk

Pokud chcete uživateli povolit úpravy hodnot pro danou buňku, upravte soubor a ProductOutlineDelegate.cs změňte GetViewForItem metodu 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ď spustíme aplikaci, může uživatel upravit buňky v zobrazení tabulky:

Příklad úpravy buněk

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

Pokud chcete zahrnout obrázek jako součást buňky v , budete muset změnit způsob, jakým metoda zobrazení obrysu vrací data, aby místo typického používá NSOutlineViewNSTableViewDelegate'sGetViewNSTableCellViewNSTextField . Napří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žití obrázků se zobrazeními osnov v naší dokumentaci Práce s obrázkem.

Zobrazení obrysů datových vazeb

Pomocí technik Key-Value kódování a datových vazeb v aplikaci Xamarin.Mac můžete výrazně snížit množství kódu, který musíte napsat a udržovat, abyste mohli naplnit prvky uživatelského rozhraní a pracovat s těmito prvky. Výhodou je také další oddělení zálohovací dat ( datovýmodel) od front-endového Uživatelské rozhraní (model-zobrazení-kontroler),což vede k jednodušší údržbě a flexibilnějšímu návrhu aplikací.

Key-Value Code (KVC) je mechanismus pro nepřímou přístup k vlastnostem objektu pomocí klíčů (speciálně formátovaných řetězců) k identifikaci vlastností místo přístupu k nim prostřednictvím proměnných instance nebo metod přistupující metody ( get/set ). Implementací přistupovacích Key-Value, které dodržují předpisy, 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 zobrazení osnovy Data Binding v naší datové vazbě a v dokumentaci pro kódování Key-Value.

Souhrn

V tomto článku se dozvíte, jak pracovat se zobrazeními osnovy v aplikaci Xamarin. Mac. Našli jsme různé typy a použití zobrazení osnovy, jak vytvořit a udržovat zobrazení osnovy v Interface Builder Xcode a jak pracovat se zobrazeními osnovy v kódu C#.