J'ai un contrôle qui hérite de (vous l'avez deviné) Contrôle. Je souhaite recevoir une notification chaque fois que les propriétés FontSize
ou Style
sont modifiées. Dans WPF, je le ferais en appelant le DependencyProperty.OverrideMetadata()
. Bien sûr, des choses utiles comme ça n'ont pas leur place dans Silverlight. Alors, comment pourrait-on recevoir ce genre de notifications?Silverlight: Comment recevoir une notification d'un changement dans un DependencyProperty hérité
Répondre
Je pense que c'est un meilleur moyen. Encore besoin de voir les avantages et les inconvénients.
/// Listen for change of the dependency property
public void RegisterForNotification(string propertyName, FrameworkElement element, PropertyChangedCallback callback)
{
//Bind to a depedency property
Binding b = new Binding(propertyName) { Source = element };
var prop = System.Windows.DependencyProperty.RegisterAttached(
"ListenAttached"+propertyName,
typeof(object),
typeof(UserControl),
new System.Windows.PropertyMetadata(callback));
element.SetBinding(prop, b);
}
Et maintenant, vous pouvez appeler RegisterForNotification pour vous inscrire à une notification de changement d'une propriété d'un élément, comme.
RegisterForNotification("Text", this.txtMain,(d,e)=>MessageBox.Show("Text changed"));
RegisterForNotification("Value", this.sliderMain, (d, e) => MessageBox.Show("Value changed"));
Voir mon post ici sur le même http://amazedsaint.blogspot.com/2009/12/silverlight-listening-to-dependency.html
En utilisant Silverlight 4.0 beta.
C'est ce que j'utilise toujours (ont pas testé sur SL si, juste WPF):
/// <summary>
/// This method registers a callback on a dependency object to be called
/// when the value of the DP changes.
/// </summary>
/// <param name="owner">The owning object.</param>
/// <param name="property">The DependencyProperty to watch.</param>
/// <param name="handler">The action to call out when the DP changes.</param>
public static void RegisterDepPropCallback(object owner, DependencyProperty property, EventHandler handler)
{
// FIXME: We could implement this as an extension, but let's not get
// too Ruby-like
var dpd = DependencyPropertyDescriptor.FromProperty(property, owner.GetType());
dpd.AddValueChanged(owner, handler);
}
Je suis assez sûr que DependencyPropertyDescrtiptors sont des bêtes mythiques dans Silverlight, malheureusement. – MojoFilter
DependencyPropertyDescriptor n'est pas pris en charge par Silverlight 2 ou 3 – markti
Vous ne pouvez pas écouter de l'extérieur à la dépendance des biens changé les notifications.
Vous pouvez accéder aux métadonnées de la propriété de dépendance avec la ligne de code suivante:
PropertyMetadata metaData = Control.ActualHeightProperty.GetMetadata(typeof(Control));
Cependant, le seul membre du public qui est exposé est « DefaultValue ».
Il existe une multitude de méthodes pour cela dans WPF. Mais ils ne sont actuellement pas pris en charge par Silverlight 2 ou 3.
La seule solution que je vois est d'écouter l'événement LayoutUpdated - oui, je sais que ça s'appelle beaucoup. Notez cependant que dans certains cas, il ne sera pas appelé même si FontSize ou Style a changé.
C'est un hack plutôt répugnant, mais vous pouvez utiliser une liaison bidirectionnelle pour simuler cela.
dire quelque chose comme:
public class FontSizeListener {
public double FontSize {
get { return fontSize; }
set { fontSize = value; OnFontSizeChanged (this, EventArgs.Empty); }
}
public event EventHandler FontSizeChanged;
void OnFontSizeChanged (object sender, EventArgs e) {
if (FontSizeChanged != null) FontSizeChanged (sender, e);
}
}
puis créer la liaison comme:
<Canvas>
<Canvas.Resources>
<FontSizeListener x:Key="listener" />
</Canvas.Resources>
<MyControlSubclass FontSize="{Binding Mode=TwoWay, Source={StaticResource listener}, Path=FontSize}" />
</Canvas>
puis accrocher à l'événement de l'auditeur dans votre sous-classe de contrôle.
Lorsque la propriété MyControlSubclass FontSize est modifiée, la liaison est désactivée et semble donc ne pas fonctionner. ne pas? –
- 1. Pour recevoir une notification après le téléchargement?
- 2. Recevoir une notification lorsque l'application en cours change dans Cocoa
- 3. événement de notification de changement visuel?
- 4. Comment puis-je recevoir une notification lorsque l'utilisateur crée un point de montage?
- 5. Comment recevoir une notification sur le déploiement d'EJB (pour configurer un temporisateur)?
- 6. Silverlight: Label n'évalue pas Liaison de DependencyProperty personnalisée
- 7. Expose DependencyProperty
- 8. DependencyProperty Strangeness
- 9. DependencyProperty personnalisée
- 10. Cocoa - Notification sur le changement de valeur NSUserDefaults?
- 11. Silverlight: détermine si DataContext est hérité ou non
- 12. Puis-je recevoir un flux sur HTTP avec JavaScript, Flash ou Silverlight?
- 13. C#: Raising un événement hérité
- 14. Dépendance de DependencyObject et de DependencyProperty
- 15. Utilisation de Silverlight DispatcherTimer - existe-t-il un meilleur moyen (DependencyProperty on Animation)?
- 16. Dans Silverlight, comment remplir un DataGrid trié à partir d'une connexion à changement dynamique
- 17. Flux hérité; tampon dans Read()
- 18. Liaison à une DependencyProperty d'un UserControl
- 19. Stupide DependencyProperty question
- 20. DependencyProperty et DataBinding?
- 21. Notification d'événement téléphonique dans .NET
- 22. Enregistrement d'une notification dans l'iPhone SDK 3.0
- 23. Implémenter un événement pour un changement dans une SortedList
- 24. comment recevoir XML dans IE8 avec mootools
- 25. Gestion des événements pour un formulaire hérité
- 26. Notification dans les rails
- 27. comment puis-je faire une notification push dans l'application iphone?
- 28. Comment afficher une icône dans la zone de notification?
- 29. passe hérité Interface à une méthode
- 30. Intégrer une application Silverlight dans une autre application Silverlight
J'aime que c'est une façon plus agréable d'envelopper cette liaison laide, mais c'est un moyen terriblement lourd d'obtenir des notifications de changement de propriété. – MojoFilter
Tant que nous devons le faire entièrement à partir du code, je suppose que nous n'avons pas une autre option jusqu'à ce que nous obtenions le DependencyPropertyDescriptor dans Silverlight de MS – amazedsaint
J'ai également utilisé cette approche, malheureusement, il fuit la mémoire. Dans mon expérience, il contiendra une référence à n'importe quel élément avec lequel vous l'utilisez, qui à son tour s'accrocheront à d'autres objets.Le coupable semble être le rappel qui conservera une référence à votre vue pour la vie de votre application. –