2013-12-03 3 views
0

Ну это мой WPF проект и проблема заключается в этом элементе управления пользователя, People.xaml.cs файл:Как сделать объект, чтобы изменить цвет с MouseEnter и MouseLeave WPF

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.IO; 

namespace Projet 
{ 
public partial class People : UserControl 
{ 
    Random rnd = new Random(); 
    string filename = "C:\\Users\\Kristen\\peoples.txt"; 
    public People() 
    { 
     InitializeComponent(); 
     dataFromFile(); 
    } 

void dataFromFile() 
    { 
     if (!File.Exists(filename)) 
      return; 

     var source = File.ReadLines(filename) 
         .Select(line => line.Split(' ')) 
         .Select(m => new { name = m[0], length = int.Parse(m[1]) }) 
         .OrderBy(x => x.length); 
     int k = 200; 
     foreach (var data in source) 
     { 

      Rectangle r = new Rectangle(); 
      r.Height = data.length; 
      r.Width = 25; 
      r.Fill = new SolidColorBrush(Colors.Red); 
      Canvas.SetLeft(r, k); 
      Canvas.SetBottom(r, 200); 
      board.Children.Add(r); 
      k += 50; 
     } 
    } 
    private void board_MouseEnter_1(object sender, MouseEventArgs e) 
    { 
     board.Background = Brushes.Blue; 
//I have tried with r.Fill = new SolidColorBrush(Colors.Red); but it wont work either 
     dataFromFile(); 
    } 

    private void juur_MouseLeave_1(object sender, MouseEventArgs e) 
    { 
     board.Background = Brushes.Yellow; 
    } 

IT берет данные из файл. В файле есть имена людей и их высоты. Это делает эти высоты для построения диаграммы с использованием прямоугольников на холсте. Я хочу изменить цвет прямоугольников с помощью MouseEnter и MouseLeave, но он просто меняет цвет фона холста. Я тоже, но мой People.xaml тоже на всякий случай.

<UserControl x:Class="Project.People" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Canvas Background="Yellow" x:Name="board" MouseEnter="board_MouseEnter_1" MouseLeave="board_MouseLeave_1"> 


</Canvas> 

+1

Является ли это WPF? WinForms? Что-то другое? Пожалуйста, отметьте свой вопрос соответствующим образом. –

+0

Есть ли конкретная причина, по которой вы не хотите использовать скрипт, такой как Java? Просто любопытно. – Jfabs

+1

Может помочь, если вы покажете нам часть вашего кода, которая импортирует пространства имен и определяет, с какими объектами вы работаете ... Похоже на WinForms, но я не знаю, какой контроль вы связываете событиями мыши с , Панель? –

ответ

1

Вы должны приложить обработчик событий для каждого прямоугольника, а не на холст. Удалить их здесь:

<Canvas Background="Yellow" x:Name="board"/> 

Затем добавить их к каждому Прямоугольник:

foreach (var data in source) 
{ 
    var r = new Rectangle(); 
    r.MouseEnter += Rectangle_MouseEnter; 
    r.MouseLeave += Rectangle_MouseLeave; 
    ... 
} 

... 

private void Rectangle_MouseEnter(object sender, MouseEventArgs e) 
{ 
    ((Rectangle)sender).Fill = Brushes.Blue; 
} 

private void Rectangle_MouseLeave(object sender, MouseEventArgs e) 
{ 
    ((Rectangle)sender).Fill = Brushes.Yellow; 
} 

Сказав, что я настоятельно рекомендую, чтобы выбросить весь этот код и использовать MVVM подход вместо этого. Возможно, начните читать около ItemsControl и Data Templating.

0

Там нет абсолютно никаких оснований для использования за-кода для этого, просто использовать стиль и триггер IsMouseOver (хотя в Yoru случая, очевидно, изменить сеттер для изменения/замены соответствующих свойств контроля ребенка):

<Canvas> 
    <Canvas.Style> 
     <Style> 
      <Setter Property="Canvas.Background" Value="Yellow"/> 
      <Style.Triggers> 
       <Trigger Property="Canvas.IsMouseOver" Value="True"> 
        <Setter Property="Canvas.Background" Value="Red" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Canvas.Style> 
</Canvas>