Öğe Oluşturma ve Hareketini Özelleştirme
Bir öğenin araç kutusundan veya yapıştırma veya taşıma işleminde başka bir öğeye sürüklenebilmesini sağlayabilirsiniz. Belirttiğiniz ilişkileri kullanarak, taşınan öğelerin hedef öğelere bağlanmasını sağlayabilirsiniz.
Öğe birleştirme yönergesi (EMD), bir model öğesi başka bir model öğesiyle birleştirildiğinde ne olacağını belirtir. Bu durum şu durumlarda gerçekleşir:
Kullanıcı araç kutusundan diyagrama veya şekle sürükler.
Kullanıcı, gezginde ekle menüsünü veya bölme şeklini kullanarak bir öğe oluşturur.
Kullanıcı bir öğeyi bir kulvardan diğerine taşır.
Kullanıcı bir öğe yapıştırır.
Program kodunuz öğe birleştirme yönergesini çağırır.
Oluşturma işlemleri kopyalama işlemlerinden farklı görünse de, aslında aynı şekilde çalışır. Örneğin araç kutusundan bir öğe eklendiğinde, bir prototipi çoğaltılır. Prototip, modelin başka bir bölümünden kopyalanan öğelerle aynı şekilde modelle birleştirilir.
EMD'nin sorumluluğu, bir nesnenin veya nesne grubunun modeldeki belirli bir konumda nasıl birleştirileceğine karar vermektir. Özellikle, birleştirilmiş grubu modele bağlamak için hangi ilişkilerin örneklenmesi gerektiğine karar verir. Ayrıca özellikleri ayarlamak ve ek nesneler oluşturmak için de özelleştirebilirsiniz.
Ekleme ilişkisi tanımladığınızda otomatik olarak bir EMD oluşturulur. Bu varsayılan EMD, kullanıcılar üst öğeye yeni alt örnekler eklediğinde ilişkinin bir örneğini oluşturur. Bu varsayılan EMD'leri, örneğin özel kod ekleyerek değiştirebilirsiniz.
Ayrıca dsl tanımına kendi EMD'lerinizi ekleyerek kullanıcıların birleştirilmiş ve alıcı sınıfların farklı bileşimlerini sürüklemesine veya yapıştırmasına izin verilmektedir.
Öğe Birleştirme Yönergesi Tanımlama
Etki alanı sınıflarına, etki alanı ilişkilerine, şekillere, bağlayıcılara ve diyagramlara öğe birleştirme yönergeleri ekleyebilirsiniz. Bunları DSL Gezgini'nde alan etki alanı sınıfının altında ekleyebilir veya bulabilirsiniz. Alıcı sınıfı, modelde bulunan ve yeni veya kopyalanan öğenin birleştirileceği öğenin etki alanı sınıfıdır.
Dizin Oluşturma Sınıfı, alıcı sınıfın üyeleriyle birleştirilebilen öğelerin etki alanı sınıfıdır. Alt sınıflara uygulanır seçeneğini False olarak ayarlamadığınız sürece, Dizin Oluşturma Sınıfının alt sınıflarının örnekleri de bu EMD tarafından birleştirilir.
İki tür birleştirme yönergesi vardır:
İşlem Birleştirme yönergesi, yeni öğenin ağaca bağlanması gereken ilişkileri belirtir.
Birleştirmeyi İletme yönergesi, yeni öğeyi genellikle bir üst öğe olan başka bir alıcı öğeye yönlendirir.
Birleştirme yönergelerine özel kod ekleyebilirsiniz:
Dizin oluşturma öğesinin belirli bir örneğinin hedef öğeyle birleştirilip birleştirilmeyeceğini belirlemek için kendi kodunuzu eklemek için özel kabul kullanır'ı seçin. Kullanıcı araç kutusundan sürüklendiğinde, "geçersiz" işaretçisi kodunuzun birleştirmeye izin vermediğini gösterir.
Örneğin, birleştirmeye yalnızca alıcı öğe belirli bir durumdayken izin vekleyebilirsiniz.
Birleştirme gerçekleştirilirken modelde yapılan değişiklikleri tanımlamak için kendi kodunu eklemek için özel birleştirme kullanır'ı seçin.
Örneğin, modeldeki yeni konumundaki verileri kullanarak birleştirilmiş öğedeki özellikleri ayarlayabilirsiniz.
Not
Özel birleştirme kodu yazarsanız, yalnızca bu EMD kullanılarak gerçekleştirilen birleştirmeleri etkiler. Aynı nesne türünü birleştirilen başka EMD'ler varsa veya EMD kullanmadan bu nesneleri oluşturan başka özel kodlar varsa, bunlar özel birleştirme kodunuzdan etkilenmez.
Yeni bir öğenin veya yeni ilişkinin her zaman özel kodunuz tarafından işlendiğinden emin olmak istiyorsanız, ekleme ilişkisinde ve AddRule
öğenin etki alanı sınıfında bir DeleteRule
tanımlamayı göz önünde bulundurun. Daha fazla bilgi için bkz . Kurallar Model İçinde Değişiklikleri Yayma.
Örnek: Özel kod olmadan EMD tanımlama
Aşağıdaki örnek, kullanıcıların araç kutusundan var olan bir şekle sürükleyerek aynı anda bir öğe ve bağlayıcı oluşturmasına olanak tanır. Örnek, DSL Tanımına bir EMD ekler. Bu değişiklik öncesinde kullanıcılar araçları diyagrama sürükleyebilir ancak mevcut şekillere sürükleyemez.
Kullanıcılar öğeleri diğer öğelere de yapıştırabilir.
Kullanıcıların aynı anda bir öğe ve bağlayıcı oluşturmasına izin vermek için
En Düşük Dil çözüm şablonunu kullanarak yeni bir DSL oluşturun.
Bu DSL'yi çalıştırdığınızda, şekiller arasında şekiller ve bağlayıcılar oluşturmanıza olanak tanır. Yeni bir ExampleElement şeklini araç kutusundan var olan bir şekle sürükleyemezsiniz.
Kullanıcıların öğeleri şekillerle
ExampleElement
birleştirmesine izin vermek için etki alanı sınıfında yeni bir EMDExampleElement
oluşturun:DSL Gezgini'nde Etki Alanı Sınıfları'yı genişletin. Sağ tıklayın
ExampleElement
ve ardından Yeni Öğe Birleştirme Yönergesi Ekle'ye tıklayın.Yeni EMD'nin ayrıntılarını görebilmek için DSL Ayrıntıları penceresinin açık olduğundan emin olun. (Menü: Görünüm, Diğer Windows, DSL Ayrıntıları.)
Nesnelerle birleştirilebilen
ExampleElement
öğe sınıfını tanımlamak için DSL Ayrıntıları penceresinde Dizin oluşturma sınıfını ayarlayın.Bu örnekte, kullanıcının yeni öğeleri var olan öğelere sürükleyebilmesi için öğesini seçin
ExampleElements
.Dizin oluşturma sınıfının DSL Gezgini'nde EMD'nin adı olduğuna dikkat edin.
Bağlantı oluşturarak birleştirme işleminin altında iki yol ekleyin:
Bir yol, yeni öğeyi üst modele bağlar. Girmeniz gereken yol ifadesi, var olan öğeden üst modele ekleme ilişkisi boyunca gider. Son olarak, yeni öğenin atanacağı yeni bağlantıdaki rolü belirtir. Yol aşağıdaki gibidir:
ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements
Diğer yol, yeni öğeyi var olan öğeye bağlar. yol ifadesi, başvuru ilişkisini ve yeni öğenin atanacağı rolü belirtir. Bu yol aşağıdaki gibidir:
ExampleElementReferencesTargets.Sources
Her yolu oluşturmak için yol gezinti aracını kullanabilirsiniz:
Yollarda bağlantı oluşturarak birleştirme işleminin altında Yol> ekle'ye tıklayın<.
Liste öğesinin sağındaki açılan oka tıklayın. Bir ağaç görünümü görüntülenir.
Belirtmek istediğiniz yolu oluşturmak için ağaçtaki düğümleri genişletin.
DSL'yi test edin:
Çözümü yeniden oluşturmak ve çalıştırmak için F5 tuşuna basın.
Oluşturulan kod, yeni DSL Tanımına uyacak şekilde metin şablonlarından güncelleştirileceği için yeniden oluşturma normalden daha uzun sürer.
Visual Studio'nun deneysel örneği başlatıldığında DSL'nizin bir model dosyasını açın. Bazı örnek öğeler oluşturun.
Örnek Öğe aracından var olan bir şekle sürükleyin.
Yeni bir şekil görünür ve mevcut şekle bağlayıcıyla bağlanır.
Var olan bir şekli kopyalayın. Başka bir şekil seçin ve yapıştırın.
İlk şeklin bir kopyası oluşturulur. Yeni bir ada sahiptir ve bağlayıcı ile ikinci şekle bağlanır.
Bu yordamda aşağıdaki noktalara dikkat edin:
Öğe Birleştirme Yönergeleri oluşturarak, herhangi bir öğe sınıfının diğer öğeleri kabul etmelerine izin vekleyebilirsiniz. EMD, alan etki alanı sınıfında oluşturulur ve kabul edilen etki alanı sınıfı Dizin sınıfı alanında belirtilir.
Yolları tanımlayarak, yeni öğeyi mevcut modele bağlamak için hangi bağlantıların kullanılacağını belirtebilirsiniz.
Belirttiğiniz bağlantılar bir ekleme ilişkisi içermelidir.
EMD hem araç kutusundan oluşturma hem de yapıştırma işlemlerini etkiler.
Yeni öğeler oluşturan özel kod yazarsanız, yöntemini kullanarak EMD'yi
ElementOperations.Merge
açıkça çağırabilirsiniz. Bu, kodunuzun modele diğer işlemlerle aynı şekilde yeni öğeler bağlamasını sağlar. Daha fazla bilgi için bkz . Kopyalama Davranışını Özelleştirme.
Örnek: EMD'ye Özel Kabul Kodu Ekleme
EMD'ye özel kod ekleyerek daha karmaşık birleştirme davranışı tanımlayabilirsiniz. Bu basit örnek, kullanıcının diyagrama sabit sayıdan fazla öğe eklemesini engeller. Örnek, ekleme ilişkisine eşlik eden varsayılan EMD'yi değiştirir.
Kullanıcının ekleyebileceklerini kısıtlamak için Özel Kabul Kodu yazmak için
Minimum Dil çözüm şablonunu kullanarak DSL oluşturun. DSL Tanımı diyagramını açın.
DSL Gezgini'nde Etki Alanı Sınıfları,
ExampleModel
, Öğe Birleştirme Yönergeleri'yi genişletin. adlıExampleElement
öğe birleştirme yönergesini seçin.Bu EMD, örneğin araç kutusundan sürükleyerek kullanıcının modelde nasıl yeni
ExampleElement
nesneler oluşturabileceğini denetler.DSL Ayrıntıları penceresinde Özel kabul kullan'ı seçin.
Çözümü yeniden oluşturun. Oluşturulan kod modelden güncelleştirileceği için bu işlem normalden daha uzun sürer.
Şu şekilde bir derleme hatası bildirilir: "Company.ElementMergeSample.ExampleElement CanMergeExampleElement için bir tanım içermiyor..."
yöntemini
CanMergeExampleElement
uygulamanız gerekir.Dsl projesinde yeni bir kod dosyası oluşturun. İçeriğini aşağıdaki kodla değiştirin ve ad alanını projenizin ad alanıyla değiştirin.
using Microsoft.VisualStudio.Modeling; namespace Company.ElementMergeSample // EDIT. { partial class ExampleModel { /// <summary> /// Called whenever an ExampleElement is to be merged into this ExampleModel. /// This happens when the user pastes an ExampleElement /// or drags from the toolbox. /// Determines whether the merge is allowed. /// </summary> /// <param name="rootElement">The root element in the merging EGP.</param> /// <param name="elementGroupPrototype">The EGP that the user wants to merge.</param> /// <returns>True if the merge is allowed</returns> private bool CanMergeExampleElement(ProtoElementBase rootElement, ElementGroupPrototype elementGroupPrototype) { // Allow no more than 4 elements to be added: return this.Elements.Count < 4; } } }
Bu basit örnek, üst modelle birleştirilebilen öğe sayısını kısıtlar. Daha ilginç koşullar için yöntemi, alıcı nesnenin özelliklerinden ve bağlantılarından herhangi birini inceleyebilir. Bir içinde taşınan ElementGroupPrototypebirleştirme öğelerinin özelliklerini de inceleyebilir. hakkında
ElementGroupPrototypes
daha fazla bilgi için bkz . Kopyalama Davranışını Özelleştirme. Bir modeli okuyan kod yazma hakkında daha fazla bilgi için bkz . Program Kodunda ModelDe Gezinme ve Güncelleştirme.DSL'yi test edin:
Çözümü yeniden oluşturmak için F5 tuşuna basın. Visual Studio'nun deneysel örneği açıldığında DSL örneğinizi açın.
Çeşitli yollarla yeni öğeler oluşturun:
Örnek Öğe aracından diyagrama sürükleyin.
Örnek Model Gezgini'nde kök düğüme sağ tıklayın ve ardından Yeni Örnek Öğe Ekle'ye tıklayın.
Diyagramda bir öğeyi kopyalayıp yapıştırın.
Modele dörtten fazla öğe eklemek için bu yollardan hiçbirini kullanamayacağınızı doğrulayın. Bunun nedeni, tümünün Öğe Birleştirme Yönergesi'ni kullanmasıdır.
Örnek: EMD'ye Özel Birleştirme kodu ekleme
Özel birleştirme kodunda, kullanıcı bir aracı sürüklediğinde veya bir öğeye yapıştırdığında ne olacağını tanımlayabilirsiniz. Özel birleştirmeyi tanımlamanın iki yolu vardır:
Özel Birleştirme Kullanır'ı seçin ve gerekli kodu sağlayın. Kodunuz, oluşturulan birleştirme kodunun yerini alır. Birleştirmenin ne yaptığını tamamen yeniden tanımlamak istiyorsanız bu seçeneği kullanın.
MergeRelate
yöntemini ve isteğe bağlı olarakMergeDisconnect
yöntemini geçersiz kılın. Bunu yapmak için etki alanı sınıfının Çift Türetilmiş Oluşturur özelliğini ayarlamanız gerekir. Kodunuz, temel sınıfta oluşturulan birleştirme kodunu çağırabilir. Birleştirme gerçekleştirildikten sonra ek işlemler gerçekleştirmek istiyorsanız bu seçeneği kullanın.Bu yaklaşımlar yalnızca bu EMD kullanılarak gerçekleştirilen birleştirmeleri etkiler. Birleştirilmiş öğenin oluşturulabileceği tüm yöntemleri etkilemek istiyorsanız, bunun alternatifi ekleme ilişkisinde ve
AddRule
birleştirilmiş etki alanı sınıfında birDeleteRule
tanımlamaktır. Daha fazla bilgi için bkz . Kurallar Model İçinde Değişiklikleri Yayma.
MergeRelate'ı geçersiz kılmak için
DSL tanımında, kod eklemek istediğiniz EMD'yi tanımladığınızdan emin olun. İsterseniz, yollar ekleyebilir ve önceki bölümlerde açıklandığı gibi özel kabul kodu tanımlayabilirsiniz.
DslDefinition diyagramında birleştirmenin alıcı sınıfını seçin. Genellikle, ekleme ilişkisinin kaynak ucundaki sınıftır.
Örneğin, En Az Dil çözümünden oluşturulan bir DSL'de öğesini seçin
ExampleModel
.Özellikler penceresinde, Çift Türetilmiş Oluşturur ayarını true olarak ayarlayın.
Çözümü yeniden oluşturun.
Dsl\Generated Files\DomainClasses.cs içeriğini inceleyin. adlı
MergeRelate
yöntemleri arayın ve içeriklerini inceleyin. Bu, kendi sürümlerinizi yazmanıza yardımcı olur.Yeni bir kod dosyasında, alıcı sınıf için kısmi bir sınıf yazın ve yöntemini geçersiz kılın
MergeRelate
. Base yöntemini çağırmayı unutmayın. Örneğin:partial class ExampleModel { /// <summary> /// Called when the user drags or pastes an ExampleElement onto the diagram. /// Sets the time of day as the name. /// </summary> /// <param name="sourceElement">Element to be added</param> /// <param name="elementGroup">Elements to be merged</param> protected override void MergeRelate(ModelElement sourceElement, ElementGroup elementGroup) { // Connect the element according to the EMD: base.MergeRelate(sourceElement, elementGroup); // Custom actions: ExampleElement mergingElement = sourceElement as ExampleElement; if (mergingElement != null) { mergingElement.Name = DateTime.Now.ToLongTimeString(); } } }
Özel Birleştirme kodu yazmak için
Dsl\Generated Code\DomainClasses.cs içinde adlı
MergeRelate
yöntemleri inceleyin. Bu yöntemler yeni bir öğe ile mevcut model arasında bağlantılar oluşturur.Ayrıca adlı
MergeDisconnect
yöntemleri inceleyin. Bu yöntemler, silinecek olan bir öğenin modelle bağlantısını kaldırır.DSL Gezgini'nde, özelleştirmek istediğiniz Öğe Birleştirme Yönergesini seçin veya oluşturun. DSL Ayrıntıları penceresinde Özel Birleştirme Kullanır'ı seçin.
Bu seçeneği ayarladığınızda , Birleştirmeyi İşlem ve İlet seçenekleri yoksayılır. Bunun yerine kodunuz kullanılır.
Çözümü yeniden oluşturun. Oluşturulan kod dosyaları modelden güncelleştirileceği için normalden daha uzun sürer.
Hata iletileri görüntülenir. Oluşturulan koddaki yönergeleri görmek için hata iletilerine çift tıklayın. Bu yönergeler, YourDomainClass ve
MergeDisconnect
YourDomainClass olmak üzere iki yöntemMergeRelate
sağlamanızı isterYöntemleri kısmi bir sınıf tanımında ayrı bir kod dosyasına yazın. Daha önce incelediğiniz örneklerde ihtiyacınız olan şeyler önerilmelidir.
Özel birleştirme kodu, nesneleri ve ilişkileri doğrudan oluşturan kodu etkilemez ve diğer EMD'leri etkilemez. Öğesinin nasıl oluşturulduğundan bağımsız olarak ek değişikliklerinizin uygulandığından emin olmak için, bunun yerine bir
AddRule
veDeleteRule
yazmayı göz önünde bulundurun. Daha fazla bilgi için bkz . Kurallar Model İçinde Değişiklikleri Yayma.
Birleştirme İşlemlerini Yeniden Yönlendirme
İleriye doğru birleştirme yönergesi, birleştirme işleminin hedefini yeniden yönlendirir. Genellikle yeni hedef, ilk hedefin ekleme üst öğesidir.
Örneğin, bileşen diyagramı şablonuyla oluşturulan bir DSL'de Bağlantı Noktaları Bileşenler'e eklenir. Bağlantı noktaları, bileşen şeklinin kenarında küçük şekiller olarak görüntülenir. Kullanıcı, Bağlantı Noktası aracını Bir Bileşen şekline sürükleyerek bağlantı noktaları oluşturur. Ancak bazen kullanıcı yanlışlıkla Bağlantı Noktası aracını bileşen yerine mevcut bir bağlantı noktasına sürükler ve işlem başarısız olur. Bu, birkaç mevcut bağlantı noktası olduğunda kolay bir hatadır. Kullanıcının bu sıkıntıdan kaçınmasına yardımcı olmak için, bağlantı noktalarının var olan bir bağlantı noktasına sürüklenmesi için izin verebilir, ancak eylemin üst bileşene yönlendirilmesini sağlayabilirsiniz. İşlem, hedef öğe bileşen gibi çalışır.
Bileşen Modeli çözümünde ileriye doğru birleştirme yönergesi oluşturabilirsiniz. Özgün çözümü derleyip çalıştırırsanız, kullanıcıların Araç Kutusu'ndan herhangi bir sayıda Giriş Bağlantı Noktası veya Çıkış Bağlantı Noktası öğesini Bir Bileşen öğesine sürükleyebileceğini görmeniz gerekir. Ancak, bir bağlantı noktasını var olan bir bağlantı noktasına sürükleyemezler. Kullanılamıyor işaretçisi, bu taşımanın etkin olmadığı konusunda uyarır. Ancak, var olan bir Giriş Bağlantı Noktasına yanlışlıkla bırakılan bir bağlantı noktasının Bileşen öğesine iletilmesini sağlamak için bir iletme birleştirme yönergesi oluşturabilirsiniz.
İletme birleştirme yönergesi oluşturmak için
Bileşen Modeli şablonunu kullanarak Etki Alanına Özgü Dil Araçları çözümü oluşturun.
DslDefinition.dsl dosyasını açarak DSL Gezgini'ni görüntüleyin.
DSL Gezgini'nde Etki Alanı Sınıfları'nı genişletin.
ComponentPort soyut etki alanı sınıfı hem InPort hem de OutPort'un temel sınıfıdır. ComponentPort'a sağ tıklayın ve ardından Yeni Öğe Birleştirme Yönergesi Ekle'ye tıklayın.
Öğe Birleştirme Yönergeleri düğümü altında yeni bir Öğe Birleştirme Yönergesi düğümü görüntülenir.
Öğe Birleştirme Yönergesi düğümünü seçin ve DSL Ayrıntıları penceresini açın.
Dizin oluşturma sınıfı listesinde ComponentPort'u seçin.
Birleştirmeyi farklı bir etki alanı sınıfına ilet'i seçin.
Yol seçimi listesinde ComponentPort'u genişletin, ComponentHasPorts'u genişletin ve ardından Bileşen'i seçin.
Yeni yol şuna benzemelidir:
ComponentHasPorts.Component/! Bileşen
Çözümü kaydedin ve ardından Çözüm Gezgini araç çubuğundaki en sağdaki düğmeye tıklayarak şablonları dönüştürün.
Çözümü derleyin ve çalıştırın. Visual Studio'nun yeni bir örneği görüntülenir.
Çözüm Gezgini'da Sample.mydsl dosyasını açın. Diyagram ve ComponentLanguage Araç Kutusu görüntülenir.
Bir Giriş Bağlantı Noktasını Araç Kutusu'ndan başka bir Giriş Bağlantı Noktasına sürükleyin. Ardından, bir OutputPort'u InputPort'a ve ardından başka bir OutputPort'a sürükleyin.
Kullanılamıyor işaretçisini görmemeniz ve yeni Giriş Bağlantı Noktasını var olan bir işaretçiye bırakabilmeniz gerekir. Yeni Giriş Bağlantı Noktasını seçin ve Bileşen'de başka bir noktaya sürükleyin.