2010-05-19 3 views
1

Je suis en train de prendre un contrôle utilisateur Silverlight 4 contenant un canevas contenant un certain nombre de FrameworkElements et de le convertir pour utiliser la liaison de données.Les événements de la souris ne se déclenchent pas lors de la liaison de données à un Silverlight ContentControl

Le XAML pour ma toile originale était:

<Canvas x:Name="panelDisplay" > 
    <Rectangle Width="50" Height="50" MouseLeftButtonDown="Element_MouseLeftButtonDown" Stroke="Aqua" StrokeThickness="5" Fill="Aquamarine" Canvas.Left="450" Canvas.Top="50" x:Name="rect1" /> 
    <Image Source="../Images/3.jpg" Stretch="UniformToFill" Width="356" Height="224" MouseLeftButtonDown="Element_MouseLeftButtonDown" Canvas.Left="317" Canvas.Top="140" x:Name="image1" /> 
</Canvas> 

Affiche le rectangle et l'image et l'événement se déclenche MouseLeftButtonDown qui traite ensuite des opérations telles que glisser le redimensionnement.

Afin d'obtenir ce travail avec databinding j'ai créé un objet appelé CanvasElement:

public class CanvasElement 
{ 
    public CanvasElement(int id, object elementContent, double width, double height, int left, int top) 
    { 
     Id = id; 
     ElementContent = elementContent; 
     Width = width; 
     Height = height; 
     Left = left; 
     Top = top; 
    } 

    public int Id { get; set; } 
    public object ElementContent { get; set; } 
    public double Width { get; set; } 
    public double Height { get; set; } 
    public int Left { get; set; } 
    public int Top { get; set; } 
} 

Le ElementContent est utilisé pour stocker le rectangle ou l'image. Je remplis un ObservableCollection appelé CanvasElements et assigne le DataContext du contrôle. J'ai changé XAML à:

<Canvas x:Name="panelDisplay" > 
    <ItemsControl x:Name="CanvasElements" ItemsSource="{Binding Path=CanvasElements}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Canvas> 
        <ContentControl Content="{Binding Path=ElementContent}" Height="{Binding Path=Height}" Width="{Binding Path=Width}" 
           Canvas.Left="{Binding Path=Left}" Canvas.Top="{Binding Path=Top}" 
           MouseLeftButtonDown="CanvasElement_MouseLeftButtonDown" /> 
       </Canvas> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Canvas> 

Mes éléments apparaissent, mais le CanvasElement_MouseLeftButtonDown ne se déclenche pas. J'ai également utilisé ContentControl dans ItemsControl.

Mes questions sont les suivantes:

Est-ce est une façon raisonnable d'aller?

Pourquoi MouseLeftButtonDown ne se déclenche-t-il pas?

+0

Bonjour, le MouseLeftButtonDown ne se déclenchera pas car vous l'avez défini dans un datatemplate de ItemsControl. – Malcolm

+0

Merci Malcolm - où dois-je réellement mettre le gestionnaire d'événements dans cette situation. –

+0

Quel contenu incluez-vous dans ce ContentControl? Il se peut que l'événement souris ne fasse pas bouillir le contrôle de contenu pour déclencher l'événement. – AnthonyWJones

Répondre

0

J'ai finalement décidé que l'utilisation de ItemsControl pour lier à une collection de formes n'était pas la meilleure solution. La raison principale de ceci est que l'utilisation d'un contrôle dans le DataTemplate pour abriter des formes ajoute de la complexité, dans mon cas j'ai une toile principale et chaque forme était logée dans sa propre toile placée sur la toile principale.

Je crois que cela causait le problème avec les événements et rend plus complexe le positionnement des formes.

0

Il est préférable de placer le gestionnaire d'événements MouseLeftButtonDown sur ItemsControl. Tous les événements qui se produisent sur ses enfants vont surgir et vous pouvez les gérer là-bas.

+0

Si je mets un gestionnaire sur le ItemsControl, il ne se déclenche toujours pas. Si je mets le gestionnaire sur le Canvas parent (pas celui dans le DataTemplate) cela se déclenche. –

+0

L'attraper sur le canevas résout-il votre problème? – Stephan

Questions connexes