2017-10-18 7 views
0

私はグラフのためのプラットフォームを持っており、マウスの上を移動している間、ノードの色を変えることに興味があります。シェイプ上でマウスを操作するにはどうすればよいですか?

どうすればいいですか?

誰でもお手伝いできますか?

これはサンプルノード.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); 
     } 
    } 
} 

、これは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> 

答えて

0

あなたは例えばMouseEnterMouseLeaveイベントを処理できます。

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

tha nks ...実際には、私は多くのノード数を持っています..私はどのようにそれらのすべてにこのメソッドを割り当てることができますか?

あなたが望むように多くの要素に同じイベントハンドラをフックできます

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

感謝を... ..どのように私はそれらのすべてに、このメソッドを割り当てることができますか? –

+0

同じイベントハンドラを必要な数の要素に接続できます。私の編集を参照してください。 – mm8

+0

ありがとうございます....素晴らしい作品! –

1

あなたはMVVMパターンを実装し、あなたの形状を表す項目の集合とビューモデルを作成する必要があり、例えばジオメトリ:

ジオメトリアイテムをItemTemplateのPath要素を持つItemsControlに表示します。 PathのスタイルはIsMouseOverプロパティでトリガーを宣言し、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> 

は、このようなビューモデルを初期化します。 は実際に私は、ノードの多くの数を持っている

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; 
} 
関連する問題