2017-10-18 65 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模式,并创建一个视图模型,代表您的形状物品的集合,例如几何图形:

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

然后在ItemTemplate中具有Path元素的ItemsControl中显示几何项目。路径样式在其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; 
}