Comment accéder à un bouton présent dans un contrôle personnalisé, à partir de la page d’implémentation?

J’ai mon generic.xaml contenant le code suivant:

             

Maintenant, sur applyTemplate, j’accède aux contrôles comme ci-dessous:

  public override void OnApplyTemplate() { base.OnApplyTemplate(); ToggleButton playPauseBtn = GetTemplateChild("playPauseBtn") as ToggleButton; Button prevBtn= GetTemplateChild("prevBtn") as Button; Button nextBtn = GetTemplateChild("nextBtn") as Button; MediaElement customMediaPlayer = GetTemplateChild("customMediaPlayer") as MediaElement; playPauseBtn.Checked += (obj, Args) => { customMediaPlayer.Pause(); playPauseBtn.Content = "Play"; }; playPauseBtn.Unchecked += (obj, Args) => { customMediaPlayer.Play(); playPauseBtn.Content = "Pause"; }; nextBtn.Click += (obj, Args) => { customMediaPlayer.Source=new Uri(CustomMediaSource.ToSsortingng(),UriKind.RelativeOrAbsolute); }; prevBtn.Click += (obj, Args) => { customMediaPlayer.Source = new Uri(CustomMediaSource.ToSsortingng(), UriKind.RelativeOrAbsolute); }; } 

Maintenant, je veux accéder au nextBtn, dans la page où je mets en œuvre comme

 CustomVideoControl myVControl=new CustomVideoControl(); 

Cela créera l’instance du contrôle, mais je veux faire quelque chose en cliquant sur les boutons suivant et précédent, qui sont présents dans le CustomVideoControl dans generic.xaml. Toute aide est la bienvenue.

Merci, Subhen

Vous devez simplement append quelques événements à votre contrôle.

  public event EventHandler MovedPrevious public event EventHandler MovedNext 

Maintenant, ceci est typiquement implémenté comme ceci: –

  protected virtual void OnMovedPrevious(EventArgs e) { var handler = MovedPrevious; if (handler != null) handler(this, e); } protected virtual void OnMovedNext(EventArgs e) { var handler = MovedNext; if (handler != null) handler(this, e); } 

Maintenant, dans vos événements de clic existants: –

 nextBtn.Click += (obj, Args) => { customMediaPlayer.Source=new Uri(CustomMediaSource.ToSsortingng(),UriKind.RelativeOrAbsolute); //No idea what this doing OnMovedNext(EventArgs.Empty); }; prevBtn.Click += (obj, Args) => { customMediaPlayer.Source = new Uri(CustomMediaSource.ToSsortingng(), UriKind.RelativeOrAbsolute); //No idea what this is doing either OnMovedPrevious(EventArgs.Empty); }; 

Maintenant, dans votre code de consommation, vous pouvez faire ce genre de chose: –

 CustomVideoControl myVControl=new CustomVideoControl(); myVControl.MovedNext += (s, args) => { /* deal with next */ }; myVControl.MovedPrevious += (s, args) => { /* deal with previous */ }; 

Désolé, mais vous le faites mal. Il n’y a pas de bonne raison pour laquelle vous devriez avoir une référence aux éléments à l’intérieur d’un DataTemplate IMO. [… Lire la suite de ce message sur le forum …]

Vous pouvez créer des événements publics dans votre contrôle personnalisé, par exemple NextButtonClicked et PreviousButtonClicked.

J’ai l’impression que vous essayez d’imiter le comportement EventSetter. Si je ne me trompe pas, jetez un coup d’œil sur cet exemple simple:

   

Ce code affecte votre événement personnalisé à l’action régulière d’un bloc de texte directement à partir de XAML (vous n’avez pas à polluer votre code avec l’access aux propriétés des contrôles).

J’espère que cela vous sera utile, mais si ce n’est pas le cas, faites-le moi savoir.

Modifier:

Désolé de ne pas être parfaitement clair (il s’agissait simplement d’un extrait de code collé rapidement). S’il vous plaît jeter un oeil sur un exemple complet:

Styles pour vos boutons suivants / précédents:

   

Code derrière:

  public event EventHandler MovedPrevious; public event EventHandler MovedNext; protected void OnMovedPrevious(object sender, RoutedEventArgs e) { if (MovedPrevious != null) { MovedPrevious(this, e); } } protected void OnMovedNext(object sender, RoutedEventArgs e) { if (MovedNext != null) { MovedNext(this, e); } } 

Depuis lors, vous pouvez accéder à OnMovedNext et à OnMovedPrevious directement à partir du contrôle de gestion de votre contrôle / de la manière indiquée par Anthony.

Désolé si ma réponse précédente était déroutante, mais c’était supposé être juste une inspiration quoi faire 🙂

Modifier:

Je n’ai pas remarqué que cela concerne uniquement Silverlight pour lequel je m’excuse 🙂 Mais, cela fonctionne parfaitement pour WPF si vous souhaitez essayer.