XAML

5

'daki Özel EventHandlers'ı ayarlamak için Bağımlılık Özellikleri Oluşturun Özel etkinlik işleyicileri, DependencyProperties kullanarak varsayılan çerçeve öğelerine eklemek istiyorum. Aşağıdaki gibiXAML

şey:

İşte
public class MyPage : Page{ 
    public void someHandler(object sender, EventArgs e){ 
     //do something 
    } 
} 

i tanımlayan sınıfı nasıl hayal kaba örneğidir: Burada

<Border custom:MyProps.HandleMyEvent="someHandler">...</Border> 

Sınır öğesi içeren kontrol için kod arkasında özelliği:

public class MyProps{ 
    public event EventHandler MyInternalHandler; 
    public static readonly DependencyProperty HandleMyEventProperty = ... 
    public void SetHandleMyEvent(object sender, EventHandler e){ 
     MyInternalHandler += e; 
    } 
} 

Sorun şu ki, ben bulamadım/bulamadım olayları/delegeleri ve EventHandlers ile DependencyProperties birleştirmek için ipuçları.

Bir ipucunuz var mı?

+0

Bu çözümün ne olacağı konusunda bir ipucu alabilir miyiz? Varsayılan çerçeve öğelerine olay eklemeyi düşünüyorsanız, yalnızca Alt Sınıf veya Davranışları kullanın. –

cevap

5

Bunun WPF ile hiçbir ilgisi olmadığını varsayacağım, bu bir gümüş ışığı sorusu.

Öncelikle mevcut bir kontrole bir Event ekleyemezsiniz. Tüm bunlara ek olarak Properties eklenirken olaylar farklı şekilde işlenir, bunlar özellik değildir.

Bu olayı içeren yeni bir tür oluşturmanız ve ardından bu tür bir bağlı özelliği oluşturmanız gerekir.

Burada sadece bir etkinliğe sahiptir temel türüdür: -

public class MyEventer 
{ 
    public event EventHandler MyEvent; 

    // What would call this?? 
    protected void OnMyEvent(EventArgs e) 
    { 
     if (MyEvent != null) 
     MyEvent(this, e); 
    } 
} 

Artık elimizde özelliği olarak MyEventer sahiptir iliştirilmiş bir özellik oluşturmak, ben ayrı bir statik sınıfta bu yerleştirmek için tercih ediyorum.

public static class MyProps 
{ 

    public static MyEventer GetEventer(DependencyObject obj) 
    { 
    return (MyEventer)obj.GetValue(EventerProperty); 
    } 

    public static void SetEventer(DependencyObject obj, MyEventer value) 
    { 
    obj.SetValue(EventerProperty , value); 
    } 

    public static readonly DependencyProperty EventerProperty = 
     DepencencyProperty.RegisterAttached("Eventer", typeof(MyEventer), typeof(MyProps), null) 

    } 
} 

Şimdi böyle bir denetime bu takmak: -

<Border ...> 
    <custom:MyProps.Eventer> 
     <custom:MyEventer MyEvent="someHandler" /> 
    </custom:MyProps.Eventer> 
</Border> 

projeyi derlemek, bu xaml yazmadan önce bunu oluşturmak için Visual Studio size seçenek sunacak dikkat edeceğiz Olay işleyicisi sizin için arkasındaki kodda. Tabii ki, bu hala önemli bir soru bırakıyor: Etkinliğin neden ateşlenmesine neden niyetlendiniz?

+0

Olay yazdığım çerçeve tarafından tetiklendi. Ve doğru şekilde gösterdiğiniz gibi, kullanıcı tanımlı işleyicileri kolayca tetiklemek için bazı OnMyEvent işlevine ihtiyacım vardı. Artık kullanıcı özel işleyici tanımlayabilir veya XAML'de sekme tuşunu kullanarak yeni bir tane oluşturabilir. i ekstra olmadan direkt DependencyProperty tercih olsaydı bile, çok güzel ..> ..>. kullanmak çok güzel olurdu. Neyse , değerli girişi için teşekkürler! :) – Juve

+0

Oldukça kötü adlandırma kuralı uyumu. –