2010-04-25 22 views
10

Margin, Padding ve BorderThickness ad alanı özelliklerini System.Windows.Documents ad alanı içinde dolduracak bir kod yazıyorum. Bu özelliklerin her biri, bir yapı olan System.Windows.Thickness biçimindeki bir değeri kabul eder. Ancak, bu özellik atamalarıyla ilgili bazı ek verileri, daha sonra kodum tarafından alınabilecekleri bir ilişkiyle ilişkilendirmek istiyorum. Thickness bir sınıf olsaydı, ek veri öğelerimi saklamak için alt sınıftaki özelliklerini ve özelliklerini yapılandıracağım. Ama bu bir yapı olduğundan, miras mümkün değildir.Yapı mirasına pratik bir alternatif var mı? (C#)

Bunu gerçekleştirmenin pratik bir yolu var mıdır? Fikirlerinize ilişkin

sayesinde

Tim

cevap

9

hiçbir iyi alternatifi vardır.

Yapmaya çalıştığınız şeye bağlı olarak, gereksinim duyduğunuz özelliklere sahip kendi sınıfınızı tanımlayabilir ve örtülü dönüştürme işlecini doğru yapı türüne örtük bir dönüşüm gerçekleştirecek şekilde tanımlayabilirsiniz. Daha sonra, bir Kalınlık parametresi bekleyen tüm yöntemlere sınıfınızda geçebileceksiniz.

Bu durum, örtük dönüştürme işleminin herhangi bir bilgiyi kaybetmemesi gerektiği anlamına geldiğinden, örtülü dönüştürme işlecini kullanma önerisine aykırıdır. Kalınlığı, okumakta olduğunuz mülkten geri alamaz ve eklediğiniz ek bilgileri görebilirsiniz.

Bu uygulamak nasıl geçerli: Ancak

public class ThicknessEx 
{ 
    public string ExtraData { get; set; } 
    public Thickness Thickness { get; set; } 

    public static implicit operator Thickness(ThicknessEx rhs) 
    { 
     return rhs.Thickness; 
    } 
} 

, başka bir yerde ek verileri depolayarak, muhtemelen daha iyi. Nasıl yapılır, ihtiyaçlarınıza ve uygulamanıza bağlı olacaktır.

+0

Çok yenilikçi bir çözüm için teşekkürler. Söylediğin gibi, neredeyse işe yarıyor, ama fazladan veriler, atandığı özelliklerden geri alınamaz olduğundan, başka bir yerde kopyalanması gerektiği anlamına geliyor, ki bu da biraz kendini yitiriyor. Fikrinizi SetValue() yöntemi ile temel bağımlılık özellikleriyle çalışmaya uyarlamayı denedim, ancak SetValue(), beklenen türden başka bir şeyde geçmenin önünde bir engel gibi görünen tür denetimi gerçekleştirir. –

0

Anahtarın yapının karma kodu olduğu bir Sözlük saklanamaz mısınız?

+2

Bu, ek verilerde aynı değere sahip olmak için iki eşit Kalınlık örneğinin gerekip gerekmediğine bağlıdır. – driis

+0

Hmm, iyi nokta. – AndrewVos

1

AugmentedThickness türünde Attached Dependency Properties kullanabilirsiniz ve sonra, değiştirdiklerinde güncellemek istedikleri temel özellikleri güncelleştirebilirsiniz. Bu, tüm özelliklerin Ekli Özellikleriniz kullanılarak gerçekleştirilmesini gerektirir; yalnızca Kalınlık özelliği, AugmentedThickness öğenizi kullanmayacaktır. Gerekirse, (biraz kötülük olsa da) Kalınlık özelliklerinde (başlatmamış olduğunuz) açık değişiklikleri dinleyebilir ve AugmentedThickness tarafından belirtilen değere geri zorlayabilirsiniz.

İlgili konular