2017-10-18 4 views
0

J'ai une plate-forme pour graphe et je suis intéressé par changer la couleur des noeuds (ou quelque chose comme changer l'opacité pour les moyens de se concentrer sur le noeud) pendant que la souris les survole.comment gérer une souris sur une forme?

comment puis-je faire cela?

Quelqu'un peut-il aider?

ce serait une représentation de noeud d'exemple dans .xaml.cs:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 
using System.Windows.Shapes; 

namespace WpfApp12 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      Ellipse myEllipse = new Ellipse(); 
      //myEllipse.Fill = nodeColour; 
      myEllipse.StrokeThickness = 1; 
      myEllipse.Stroke = Brushes.Black; 
      myEllipse.Width = 30; 
      myEllipse.Height = 30; 
      Canvas.SetLeft(myEllipse, 50); 
      Canvas.SetTop(myEllipse, 50); 
      content.Children.Add(myEllipse); 
     } 
    } 
} 

ce qui est le code XAML:

<Window x:Class="WpfApp12.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApp12" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Canvas x:Name="content" HorizontalAlignment="Left" Height="299" Margin="10,10,0,0" VerticalAlignment="Top" Width="497"/> 

    </Grid> 
</Window> 

Répondre

0

Vous pouvez par exemple gérer les MouseEnter et MouseLeave événements:

myEllipse.MouseEnter += (s, e) => myEllipse.Fill = Brushes.Red; 
myEllipse.MouseLeave += (s, e) => myEllipse.Fill = Brushes.Transparent; 

tha nks ... en fait j'ai beaucoup de nombre de noeuds .. comment puis-je assigner cette méthode à chacun d'eux?

Vous pouvez brancher les mêmes gestionnaires d'événements autant d'éléments que vous voulez:

public MainWindow() 
{ 
    InitializeComponent(); 
    Ellipse myEllipse = new Ellipse(); 
    ... 

    myEllipse.MouseEnter += MyEllipse_MouseEnter; 
    myEllipse.MouseLeave += MyEllipse_MouseLeave; 
} 

private void MyEllipse_MouseLeave(object sender, MouseEventArgs e) 
{ 
    Ellipse ellipse = sender as Ellipse; 
    ellipse.Fill = Brushes.Transparent; 
} 

private void MyEllipse_MouseEnter(object sender, MouseEventArgs e) 
{ 
    Ellipse ellipse = sender as Ellipse; 
    ellipse.Fill = Brushes.Red; 
} 
+0

merci ... en fait je ai beaucoup de nombre de noeuds .. comment puis-je attribuer cette méthode à tous? –

+0

Vous pouvez connecter les mêmes gestionnaires d'événements à autant d'éléments que vous voulez. Voir ma modification. – mm8

+0

merci beaucoup .... ça marche super !!! –

1

Vous devriez mettre en œuvre le modèle MVVM et créer un modèle de vue avec une collection d'objets qui représentent vos formes, par exemple Géométries:

public class ViewModel 
{ 
    public ObservableCollection<Geometry> Shapes { get; } 
     = new ObservableCollection<Geometry>(); 
} 

afficher ensuite les éléments de la géométrie dans un ItemsControl qui a un élément de chemin dans son ItemTemplate. Le style du chemin d'accès déclare un déclencheur sur sa propriété IsMouseOver, qui définit la propriété Fill.

<ItemsControl ItemsSource="{Binding Shapes}"> 
    <ItemsControl.Resources> 
     <SolidColorBrush x:Key="NormalBrush" Color="AliceBlue"/> 
     <SolidColorBrush x:Key="MouseOverBrush" Color="Red"/> 
     <Style x:Key="ShapeStyle" TargetType="Path"> 
      <Setter Property="Stroke" Value="Black"/> 
      <Setter Property="Fill" Value="{StaticResource NormalBrush}"/> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Fill" Value="{StaticResource MouseOverBrush}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ItemsControl.Resources> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Path Style="{StaticResource ShapeStyle}" Data="{Binding}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Initialiser le modèle de vue comme celui-ci:

public MainWindow() 
{ 
    InitializeComponent(); 

    var vm = new ViewModel(); 
    vm.Shapes.Add(new EllipseGeometry(new Point(50, 50), 15, 15)); 
    vm.Shapes.Add(new RectangleGeometry(new Rect(85, 85, 30, 30))); 
    vm.Shapes.Add(new EllipseGeometry(new Point(150, 150), 15, 15)); 

    DataContext = vm; 
}