2010-11-24 18 views
6
, WPF Media Kit kitaplığından türetilen ortam öğesi denetiminden oluşur. MediaElementBase sınıfı, kullanıcının öğe yüklendiğinde/yüklenirken ne olacağını belirtmesine olanak veren ve UnloadedBehavior iki özelliğini sağlar.

WPF DataTemplate, yüklendiğinde bazı bağımlılık özelliklerini sıfırlar

I (aşağıda) bir DataTemplate bu kullanırken Unloaded olay çağrılmadan önce, bu özellikleri yalnızca varsayılan anlamına gelen şablon kaldırıldığında onların varsayılan değerine sıfırlamak, ama olsun olduğunu bulma yaşıyorum

UnloadedBehavior hiç çalıştırır:

<DataTemplate DataType="{x:Type Channels:AnalogChannel}"> 
    <Controls:AnalogTvGraphFileElement 
     LoadedBehavior="Play" 
     UnloadedBehavior="Stop" 
     Channel="{Binding}" /> 
</DataTemplate> 

kontrolü yalnızca bir sayfaya bir elementtir ve Unloaded normal gezinme-away olay üzerinden oluştuğunda bu oluşmaz. DependencyPropertyChanged EventHandler ayıklama

kontrolleri (PresentationFramework.dll içinde), bir iç bir yöntem System.Windows.StyleHelper.InvalidatePropertiesOnTemplateNode bir DependencyProperty, potansiyel olarak kalıtımsal olduğu ortaya çıkarır ve bu değilse, bunu geçersiz kılmaktadır. FrameworkPropertyMetadataOptions.Inherits eklemek için LoadedBehavior/UnloadedBehavior özellik metadatasını değiştirerek, bu özellik şablon değiştiğinde sıfırlanmasını durdurur.

Bunun neden olduğunu bilen var mı? Inherits bayrağını bir geçici çözüm olarak ekleyebilirim, çünkü bu öğenin bundan etkilenecek hiçbir alt öğesi yoktur, ancak neden doğru bir şey olup olmadığını bilmek isterim.

Ne yaptığım ve neden değiştirdiğim hakkında daha fazla bilgi alıyorsanız ve DataTemplates numaralı telefonu açıklıyorsanız, bir açıklama için this question görüntüleyebilirsiniz.

+0

WPF Ortam Takımı'nın hangi sürümünü kullanıyorsunuz? Mevcut ikili sürüm mü yoksa kaynağından mı derliyorsunuz? Bu yorum yazılırken, mevcut ikili (v1.5) kaynak ağacın arkasında yaklaşık bir yıldır. Jez, aniden değişen özellik değerleriyle ilgili bazı hataları düzeltdi. Düzeltmenin doğrudan kullandığınız mülklerle ilgili olduğunu düşünmüyorum, ancak sorunu yeniden bulmak için hangi sürümü kullandığınızı bilmek faydalı olacaktır. –

+0

Kaynaktan derliyorum. Sorun, WPF Media Kit'e özgü değil - basit bir bağımsız uygulamada yeniden üretebiliyorum. – jeffora

+0

Açıklandığı gibi sorun, Boşaltılmamış Davranış ile ilgilidir. Kök nedeninin - mülklerin bir boşaltmada sıfırlanması gerçeği - evrensel olacağını, ancak genel olarak hangi sorunların ortaya çıktığını anlıyorum. WPF Medya Kitinde bu bir problemdir çünkü bu özelliği, sadece boşaltma işleminden sonra değerin ne olduğuyla ilgilendiğiniz bir özellik vardır. Bu ne sıklıkta oluyor? –

cevap

7

Bu öğeyi doğrudan şablona yerleştirmekten ziyade, AnalogTvGraphFileElement öğenizi içeren bir kullanıcı denetimi oluşturmayı ve ardından bu kullanıcı denetimini şablonunuzda kullanmayı denediniz mi?

Burada sorun, şablon sistemlerin neden olduğu özellikleri belirleyip iptal etmesinden kaynaklanıyorsa, öğelerinizin bir kullanıcı denetimine taşınması, özelliklerin artık şablondan ayarlanmayacağı için yardımcı olmalıdır.

İlk olarak neden bu durumu görüyorsanız, Boşaltılan olayın göreceli sıralamasını ve şablon aracılığıyla ayarlanan özelliklerin kaybolduğunu söyleyebildiğim kadarıyla, belgelenmemelisiniz. herhangi bir özel sipariş üzerine. özellik değerlerini kaybederseniz, belgelenmiştir. (Ya da en azından, bu belgelerden gizlidir.) WPF özellik sistemi, bir şablondaki yerel değerleri, şablonun dışındaki normal yerel değerlerden farklı bir şey olarak değerlendirir. Bu MSDN sayfasını dependency property precedence numaralı telefona bakın - 4b, şablondaki yerel özellik kümelerinin yerel özellikler ile aynı şey olmadığını gösterir. (Bir ayrım yapmak garip görünüyor, ancak her iki kaynaktan da özellik değerlerini şablon 4b'ye - ve daha sonra çalışma zamanında ayarlayarak, öğenin belirli bir örneğinde ve ayarında bulunması ve ayarlanması mümkün olmalıdır. Bu kod için yerel tip 3 - tip 3 yerel değerlerden daha yüksek önceliğe sahip olmak istersiniz.)

Bu şekilde göründüğünde gariptir. Tek bir şablon, birden çok örnek için değerler sağlayabilir. Herhangi bir sayıda unsuru etkileyebilecek sadece bir yerel özellik belirleyiciniz var. (Bu, bir şablonun basit bir zihinsel modelinin, görsel bir ağaç oluşturan ve o ağacın üzerindeki özellikleri ayarlayan bir fabrika olduğu anlamına gelir.Görsel bir ağaç oluşturan bir fabrikadır, ancak özellikleri ayarlamaz. Özellik sistemi, daha yüksek öncelikli özellik değeri kaynaklarının yokluğunda, bir öğenin şablonu olan görsel bir ağaçtaki öğelerin şablondaki ayarlayıcılardan değer alacağını basitçe garanti eder.)

Bu sayfa hemen anlatıyor Şablon 4b özellikleri, şablon etkinleşmeyi bıraktıktan sonra ortadan kalkar - şablon artık şablona sahip şablon için artık şablon değildir ve bu şablon tarafından sağlanan herhangi bir yerel değer, artık 4b türünde (veya başka türde) aday değerler olmayacaktır. mülkiyet için). Kısacası, şablon bir şey için şablon olmayı bıraktıktan sonra, o şey ya da içindeki herhangi bir şey için değer sağlayan herhangi bir işe sahip olmayı keser. Bu, bir şablon örneğinin görsel ağacının, artık hiçbir şey için değil, ancak henüz boşaltılamadığı bir tuhaf ortam haline girdiği anlamına gelir. Tabii

, boşaltma bittikten ilgili görsel ağacı önce değerlerini sağlayarak durdurmak için şablon için yararlı görünebilir ama değil, değeri bir eleman kaldırılırken garip durum biraz zaman tek önemli olduğunu belki özellikler ve özellikle için tasarlanmış bir değil. Bunu düşünmek, muhtemelen bağımlılık özellikleri olmamalıdır - DP'leri kullanışlı yapan hemen hemen tüm özellikler görsel ağaçtan kaldırıldıktan sonra gerçekten çok fazla anlam ifade etmemektedir. Öyle ki, Media Kit'deki UnloadedBehaviour'un bir DP olduğu ilk hatadır.

Devralınan özelliklerin (tip 10), yerel şablon özellik kümelerinden (tip 4b) daha sonra kapatılmasının tutarsızlığı var, ancak burada herhangi bir özel sipariş beklemenin makul olduğundan emin değilim. Belgelerin bir sıraya veya diğerine işaret ettiği aşikar değildir, bu nedenle ya sipariş doğrudur ... ve WPF bir senaryoda bir sıra seçerek ve diğeri de başka bir senaryoda bunu kullanarak görünür.

+0

Bu, UserControl'ın değerleri AnalogTvGraphFileElement öğesine iletmek için kullanılan herhangi bir Bağımlılık Özelliği olmadığı sürece soruda açıklanan davranışı durdurur. Esasen, sadece başka bir katman oluşturur ve kalıtımsal özellikler olmadığında kalıtım dışı özelliklerin neden sıfırlandığını açıklamamaktadır. – jeffora

+0

Seni çabucak acele etmeyi umuyordum ve kazma işleminden önce bir medya kit sürümü sorunu olup olmadığını öğrenmek için bekliyordum. Özelliklerin sıfırlanmasının nedeni, yerel özellik sözdizimini kullanarak ayarlanan özelliklerin Farklı bir kaynak ve şablon gittiğinde, bu özellik değerleri kaybolur. Kalıtsal olanların bir hata gibi durması gerçeği ... –

+0

Tamam, bu cevabı, mülk sisteminin ilk etapta nasıl yapıldığına dair bazı bilgiler eklemek için düzenledim. Bu muhtemelen çok fazla yardımcı olmuyor - en son "bunu yapma". Ancak, kullanıcı kontrolü gibi ekstra bir katmana gerçekten ihtiyacınız olduğu anlamına gelir. DP'ler yerine düzenli özellikleri kullanmayı deneyin. Ya da başarısız olursa, UserControl'ün Loaded olayındaki özellik değerini ya da değerin nereden geldiğini keşfetmek için DependencyPropertyHelper'ı kullanın ve düşük önceliğe sahip bir kaynağa geri döndüğünde göz ardı edin. Büyük açıklama için –

İlgili konular