Bagikan melalui


Menyesuaikan jendela Properti

Anda dapat menyesuaikan tampilan dan perilaku jendela properti dalam bahasa khusus domain (DSL) Anda di Visual Studio. Dalam Definisi bahasa khusus domain, Anda menentukan properti domain di setiap kelas domain. Secara default, saat Anda memilih instans kelas, baik pada diagram atau di Penjelajah Model, setiap properti domain tercantum di jendela properti. Ini memungkinkan Anda melihat dan mengedit nilai properti domain, bahkan jika Anda belum memetakannya ke bidang bentuk pada diagram.

Nama, deskripsi, dan kategori

Nama dan Nama Tampilan. Dalam definisi properti domain Anda, Nama Tampilan properti adalah nama yang muncul pada saat eksekusi di jendela properti. Sedangkan Nama digunakan saat Anda menulis kode program untuk memperbarui properti. Nama harus merupakan nama alfanumerik runtime bahasa umum yang benar, tetapi Nama Tampilan dapat berisi spasi.

Saat Anda mengatur Nama properti dalam Definisi bahasa khusus domain, Nama Tampilannya secara otomatis diatur ke salinan Nama. Jika Anda menulis nama kasus Pascal seperti "PengukurBahanBakar", Nama Tampilan akan secara otomatis berisi spasi: "Pengukur Bahan Bakar". Namun, Anda dapat mengatur Nama Tampilan secara eksplisit ke nilai lain.

Deskripsi. Deskripsi properti domain muncul di dua tempat:

  • Di bagian bawah jendela properti saat pengguna memilih properti. Anda dapat menggunakannya untuk menjelaskan kepada pengguna tentang apa yang diwakili properti.

  • Dalam kode program yang dihasilkan. Jika Anda menggunakan fasilitas dokumentasi untuk mengekstrak dokumentasi API, dokumentasi akan muncul sebagai deskripsi dari properti ini di dalam API.

Kategori. Kategori adalah judul di jendela Properti.

Mengekspos fitur gaya

Beberapa fitur dinamis elemen grafis dapat direpresentasikan atau diekspos sebagai properti domain. Fitur yang telah diekspos dengan cara ini dapat diperbarui oleh pengguna dan dapat dengan lebih mudah diperbarui oleh kode program.

Klik kanan kelas bentuk di Definisi bahasa khusus domain, arahkan ke Tambahkan Ekspos, lalu pilih fitur.

Pada bentuk, Anda dapat mengekspos properti FillColor, OutlineColor, TextColor, OutlineDashStyle, OutlineThickness, dan FillGradientMode. Pada konektor, Anda dapat mengekspos properti Color,TextColor, DashStyle, dan Thickness. Pada diagram, Anda dapat mengekspos properti FillColor dan TextColor.

Saat pengguna bahasa khusus domain Anda memilih elemen dalam model, properti elemen tersebut ditampilkan di jendela properti. Namun, Anda juga dapat menampilkan properti elemen terkait yang ditentukan. Hal ini berguna jika Anda telah mendefinisikan sekelompok elemen yang bekerja sama. Misalnya, Anda dapat menentukan elemen utama dan elemen plug-in opsional. Jika elemen utama dipetakan ke suatu bentuk dan yang lain tidak, melihat semua properti elemen tersebut seolah-olah berada di satu elemen akan sangat membantu.

Efek ini bernama penerusan properti dan terjadi secara otomatis dalam beberapa kasus. Dalam kasus lain, Anda dapat mencapai penerusan properti dengan menentukan pendeskripsi tipe domain.

Kasus penerusan properti default

Saat pengguna memilih bentuk atau konektor, atau elemen di Penjelajah, properti berikut ditampilkan di jendela Properti:

  • Properti domain yang ditentukan pada kelas domain elemen model, termasuk yang ditentukan dalam kelas dasar. Pengecualian berlaku untuk properti domain yang Dapat Dijelajahi telah Anda atur ke False.

  • Nama elemen yang ditautkan melalui hubungan yang memiliki kelipatan 0..1. Ini menyediakan metode yang nyaman untuk melihat elemen yang ditautkan secara opsional, bahkan jika Anda belum menentukan pemetaan konektor untuk hubungan tersebut.

  • Properti domain dari hubungan penyematan yang menargetkan elemen. Karena hubungan penyematan biasanya tidak ditampilkan secara eksplisit, hal ini memungkinkan pengguna melihat properti mereka.

  • Properti domain yang ditentukan pada bentuk atau konektor yang dipilih.

Menambahkan penerusan properti

Untuk meneruskan properti, Anda menentukan pendeskripsi tipe domain. Jika Anda memiliki hubungan domain antara dua kelas domain, Anda bisa menggunakan pendeskripsi tipe domain untuk mengatur properti domain di kelas pertama ke nilai properti domain di kelas domain kedua. Misalnya, jika Anda memiliki hubungan antara kelas domain Buku dan kelas domain Penulis, Anda dapat menggunakan pendeskripsi tipe domain untuk membuat properti Nama Penulis Buku muncul di jendela Properti saat pengguna memilih Buku.

Catatan

Penerusan properti hanya memengaruhi jendela Properti saat pengguna mengedit model. Ia tidak mendefinisikan properti domain di kelas penerima. Jika Anda ingin mengakses properti domain yang diteruskan di bagian lain dari Definisi bahasa khusus domain atau dalam kode program, Anda harus mengakses elemen penerusan.

Prosedur berikut mengasumsikan bahwa Anda telah membuat bahasa khusus domain. Beberapa langkah pertama meringkas prasyarat.

Meneruskan properti dari elemen lain

  1. Buat solusi Alat Bahasa Khusus Domain yang berisi setidaknya dua kelas, yang dalam contoh ini disebut Buku dan Penulis. Harus ada hubungan antara Buku dan Penulis.

    Kardinalitas peran sumber (peran di sisi Buku) harus 0..1 atau 1..1, sehingga setiap Buku memiliki satu Penulis.

  2. Di Penjelajah bahasa khusus domain, klik kanan kelas domain Buku, lalu klik Tambahkan DomainTypeDescriptor Baru.

    Node bernama Jalur Pendeskripsi Properti Kustom muncul di bawah node Pendeskripsi Tipe Kustom.

  3. Klik kanan node Pendeskripsi Tipe Kustom, lalu klik Tambahkan PropertyPath Baru.

    Jalur properti baru muncul di bawah node Jalur Pendeskripsi Properti Kustom.

  4. Pilih jalur properti baru, lalu di jendela Properti, atur Jalur ke Properti ke jalur elemen model yang sesuai.

    Anda dapat mengedit jalur dalam tampilan pohon dengan mengklik panah bawah di sebelah kanan properti ini. Untuk informasi selengkapnya tentang jalur domain, lihat Sintaks Jalur Domain. Saat Anda selesai mengeditnya, jalur harus menyerupai BookReferencesAuthor.Author/!Author.

  5. Atur Properti ke properti domain Nama Penulis.

  6. Atur Nama Tampilan ke Nama Penulis.

  7. Transformasikan Semua Templat, bangun, dan jalankan bahasa khusus domain.

  8. Dalam diagram model, buat buku, penulis, dan tautkan menggunakan hubungan referensi. Pilih elemen buku, lalu di jendela Properti Anda akan melihat Nama Penulis selain properti buku. Ubah nama penulis tertaut, atau tautkan buku ke penulis lain, dan amati bahwa Nama Penulis buku berubah.

Penyunting properti kustom

Jendela properti memberikan pengalaman pengeditan default yang sesuai untuk jenis setiap properti domain. Misalnya, untuk tipe terbilang, pengguna melihat daftar drop-down, dan untuk properti numerik, pengguna dapat memasukkan digit. Ini hanya berlaku untuk jenis bawaan. Jika Anda menentukan jenis eksternal, pengguna akan dapat melihat nilai properti, tetapi tidak dapat mengeditnya.

Namun, Anda dapat menentukan penyunting dan jenis berikut:

  1. Penyunting lain yang digunakan dengan jenis standar. Misalnya, Anda dapat menentukan penyunting jalur file untuk properti string.

  2. Jenis eksternal untuk properti domain dan penyunting untuk properti tersebut.

  3. Penyunting .NET seperti penyunting jalur file, atau Anda dapat membuat penyunting properti kustom Anda sendiri.

    Konversi antara jenis eksternal dan jenis seperti String, yang memiliki editor default.

    Dalam bahasa khusus domain, jenis eksternal adalah jenis apa pun yang bukan salah satu jenis sederhana (seperti Boolean atau Int32) atau String.

Menentukan properti domain yang memiliki jenis eksternal

  1. Di Penjelajah Solusi, tambahkan referensi ke assembly (DLL) yang berisi jenis eksternal, dalam proyek Dsl.

    Assembly dapat berupa assembly .NET, atau assembly yang disediakan oleh Anda.

  2. Tambahkan jenis ke daftar Jenis Domain, kecuali Anda sudah melakukannya.

    1. Buka DslDefinition.dsl dan di Penjelajah bahasa khusus domain, klik kanan node akar, lalu klik Tambahkan Jenis Eksternal Baru.

      Entri baru muncul di bawah node Jenis Domain.

      Peringatan

      Item menu ada di node akar bahasa khusus domain, bukan pada node Jenis Domain.

    2. Atur nama dan namespace layanan jenis baru di jendela Properti.

  3. Tambahkan properti domain ke kelas domain dengan cara seperti biasa.

    Di jendela Properti, pilih jenis eksternal dari daftar drop-down di bidang Jenis.

    Pada tahap ini, pengguna dapat melihat nilai properti, tetapi mereka tidak dapat mengeditnya. Nilai yang ditampilkan diperoleh dari fungsi ToString(). Anda dapat menulis kode program yang menetapkan nilai properti, misalnya dalam perintah atau aturan.

Mengatur penyunting properti

Tambahkan atribut runtime bahasa umum ke properti domain, dalam bentuk berikut:

[System.ComponentModel.Editor (
   typeof(AnEditor),
   typeof(System.Drawing.Design.UITypeEditor))]

Anda dapat mengatur atribut pada properti menggunakan entri Atribut Kustom di jendela Properti.

Jenis AnEditor harus berasal dari jenis yang ditentukan dalam parameter kedua. Parameter kedua harus berupa UITypeEditor atau ComponentEditor. Untuk informasi selengkapnya, lihat EditorAttribute .

Anda dapat menentukan penyunting Anda sendiri atau penyunting .NET, seperti FileNameEditor atau ImageEditor. Misalnya, gunakan prosedur berikut untuk memiliki properti di mana pengguna dapat memasukkan nama file.

Menentukan properti domain nama file

  1. Tambahkan properti domain ke kelas domain di Definisi bahasa khusus domain Anda.

  2. Pilih properti baru. Di bidang Atribut Kustom di jendela Properti, masukkan atribut berikut. Untuk memasukkan atribut ini, klik elipsis [...] lalu masukkan nama atribut dan parameter secara terpisah:

    [System.ComponentModel.Editor (
       typeof(System.Windows.Forms.Design.FileNameEditor)
       , typeof(System.Drawing.Design.UITypeEditor))]
    
    
  3. Biarkan Jenis properti domain pada pengaturan default String-nya.

  4. Untuk menguji penyunting, verifikasi bahwa pengguna dapat membuka penyunting nama file untuk mengedit properti domain Anda.

    1. Tekan CTRL+F5 atau F5. Dalam solusi penelusuran kesalahan, buka file uji. Buat elemen kelas domain dan pilih.

    2. Di jendela Properti, pilih properti domain. Bidang nilai menunjukkan elipsis [...].

    3. Klik elipsis tersebut. Kotak dialog file muncul. Pilih file dan tutup kotak dialog. Jalur file sekarang merupakan nilai properti domain.

Menentukan penyunting properti Anda sendiri

Anda dapat menentukan penyunting Anda sendiri. Anda akan melakukan ini untuk memungkinkan pengguna mengedit jenis yang telah Anda tentukan, atau mengedit jenis standar dengan cara khusus. Misalnya, Anda dapat mengizinkan pengguna untuk memasukkan string yang mewakili rumus.

Anda menentukan penyunting dengan menulis kelas yang berasal dari UITypeEditor. Kelas Anda harus mengambil alih:

  • EditValue, untuk berinteraksi dengan pengguna dan memperbarui nilai properti.

  • GetEditStyle, untuk menentukan apakah penyunting Anda akan membuka dialog atau menyediakan menu drop-down.

Anda juga dapat memberikan representasi grafis dari nilai properti yang akan ditampilkan di kisi properti. Untuk melakukan ini, ambil alih GetPaintValueSupported dan PaintValue. Untuk informasi selengkapnya, lihat UITypeEditor .

Catatan

Tambahkan kode dalam file kode terpisah di proyek Dsl.

Contohnya:

internal class TextFileNameEditor : System.Windows.Forms.Design.FileNameEditor
{
  protected override void InitializeDialog(System.Windows.Forms.OpenFileDialog openFileDialog)
  {
    base.InitializeDialog(openFileDialog);
    openFileDialog.Filter = "Text files(*.txt)|*.txt|All files (*.*)|*.*";
    openFileDialog.Title = "Select a text file";
  }
}

Untuk menggunakan penyunting ini, atur Atribut Kustom properti domain ke:

[System.ComponentModel.Editor (
   typeof(MyNamespace.TextFileNameEditor)
   , typeof(System.Drawing.Design.UITypeEditor))]

Untuk informasi selengkapnya, lihat UITypeEditor .

Menyediakan daftar drop-down nilai

Anda dapat menyediakan daftar nilai untuk dipilih pengguna.

Catatan

Teknik ini menyediakan daftar nilai yang dapat berubah pada saat eksekusi. Jika Anda ingin menyediakan daftar yang tidak berubah, pertimbangkan untuk menggunakan tipe terbilang sebagai jenis properti domain Anda.

Untuk menentukan daftar nilai standar, Anda menambahkan atribut runtime bahasa umum yang memiliki bentuk berikut ke properti domain Anda:

[System.ComponentModel.TypeConverter
(typeof(MyTypeConverter))]

Tentukan kelas yang berasal dari TypeConverter. Tambahkan kode dalam file terpisah di proyek Dsl. Contohnya:

/// <summary>
/// Type converter that provides a list of values
/// to be displayed in the property grid.
/// </summary>
/// <remarks>This type converter returns a list
/// of the names of all "ExampleElements" in the
/// current store.</remarks>
public class MyTypeConverter : System.ComponentModel.TypeConverter
{
  /// <summary>
  /// Return true to indicate that we return a list of values to choose from
  /// </summary>
  /// <param name="context"></param>
  public override bool GetStandardValuesSupported
    (System.ComponentModel.ITypeDescriptorContext context)
  {
    return true;
  }

  /// <summary>
  /// Returns true to indicate that the user has
  /// to select a value from the list
  /// </summary>
  /// <param name="context"></param>
  /// <returns>If we returned false, the user would
  /// be able to either select a value from
  /// the list or type in a value that is not in the list.</returns>
  public override bool GetStandardValuesExclusive
      (System.ComponentModel.ITypeDescriptorContext context)
  {
    return true;
  }

  /// <summary>
  /// Return a list of the values to display in the grid
  /// </summary>
  /// <param name="context"></param>
  /// <returns>A list of values the user can choose from</returns>
  public override StandardValuesCollection GetStandardValues
      (System.ComponentModel.ITypeDescriptorContext context)
  {
    // Try to get a store from the current context
    // "context.Instance"  returns the element(s) that
    // are currently selected i.e. whose values are being
    // shown in the property grid.
    // Note that the user could have selected multiple objects,
    // in which case context.Instance will be an array.
    Store store = GetStore(context.Instance);

    List<string> values = new List<string>();

    if (store != null)
    {
      values.AddRange(store.ElementDirectory
        .FindElements<ExampleElement>()
        .Select<ExampleElement, string>(e =>
      {
        return e.Name;
      }));
    }
    return new StandardValuesCollection(values);
  }

  /// <summary>
  /// Attempts to get to a store from the currently selected object(s)
  /// in the property grid.
  /// </summary>
  private Store GetStore(object gridSelection)
  {
    // We assume that "instance" will either be a single model element, or
    // an array of model elements (if multiple items are selected).

    ModelElement currentElement = null;

    object[] objects = gridSelection as object[];
    if (objects != null && objects.Length > 0)
    {
      currentElement = objects[0] as ModelElement;
    }
    else
    {
        currentElement = gridSelection as ModelElement;
    }

    return (currentElement == null) ? null : currentElement.Store;
  }

}