2009-04-06 8 views
0

J'ai une petite application WPF, qui a un canevas et une grille. J'ai placé des contrôles utilisateur personnalisés sur la grille. Maintenant je voudrais capturer quelques événements de souris sur eux. En conséquence d'un événement, j'aimerais ajouter (ou modifier) ​​quelque chose à la toile. Toutefois, dans le contrôle utilisateur, vous n'avez pas une référence à la toile sous-jacente. Première question, existe-t-il un moyen d'obtenir cette référence, par exemple comme getElementById (..) en JavaScript.WPF Événements et références aux objets, et comment les gérer

Aussi, je sais que vous devriez éviter de telles références, si vous voulez une architecture propre. Dans ce cas, il est recommandé d'intercepter les événements à un contrôle utilisateur spécifique et de pouvoir ensuite appeler quelque chose sur un autre objet.

Répondre

1

Vous avez accès au canevas, à la grille ou à tout autre élément de votre UserControl. Le moyen le plus simple d'y accéder est de s'assurer que chacun a un nom qui est fait en utilisant l'attribut x: Name.

<Grid x:Name="myGrid"> 

Ensuite, dans votre UserControl, vous pouvez y accéder avec myGrid. Pour accéder à une grille depuis l'extérieur de UserControl, vous devez créer une méthode dans votre UserControl qui vous permet de la manipuler.

Il existe une méthode this.FindName que vous pouvez utiliser dans un UserControl qui est l'équivalent de getElementById de javascript, mais vous ne devriez pas avoir besoin de l'utiliser, car vous pouvez accéder aux objets directement avec leur nom.

+0

thx :) Cependant, j'ai vu qu'il y a des événements routés dans wpf .. Je lis maintenant sur les événements routés. – Nils

+0

Les événements routés sont bons pour faire passer les événements dans la hiérarchie de contrôle. Si vous disposez d'un contrôle de niveau supérieur ou d'une fenêtre, vous pouvez permettre à certains événements de le faire simplement en ne les manipulant pas sur les contrôles enfants. – sipwiz

1

WPF dispose d'une nouvelle architecture d'événement susceptible de vous aider. Les événements "routés" peuvent soit "passer" du conteneur racine logique, à travers tous les conteneurs intermédiaires, à l'élément source d'événement, soit "bulles" à partir de l'élément source (les événements "tunneling" et "bubbling" se propagent dans directions). Tout cela pour dire que vous pouvez généralement intercepter des événements à partir d'éléments enfants en enregistrant un gestionnaire d'événements sur le conteneur. Voici un exemple d'intercepter les événements de clic de bouton de boutons dans un StackPanel:

<StackPanel ButtonBase.Click="HandleButtonClick"> 
    <Button>Foo</Button> 
    <Button>Bar</Button> 
</StackPanel> 

Et HandleButtonClick pourrait être mis en œuvre comme ceci:

private void HandleButtonClick(object sender, RoutedEventArgs e) 
{ 
    var button = e.OriginalSource as Button; 
    if (button != null) MessageBox.Show(button.Content.ToString()); 
} 

Selon ce type de « contrôles personnalisés » que vous utilisez, ce peut ne pas être possible. C'est parce que tous les événements ne sont pas des événements "routés". Les événements de contrôle WPF sont généralement des événements routés.

Questions connexes