WPF, Animation og dynamiske objecter
Hej,Jeg er begyndt at lege lidt med WPF ... og er lige nu løbet ind i et problem jeg ikke lige kan gennemskue ... specielt hvad der går galt.
Kort fortalt:
Jeg har en masse Ellipse object som bliver placeret random på et Canvas .... jeg har så lave en Enter/Leave på de Ellipse objecter som virker helt fint.
Fra start er alle Ellipse objecters Opacity sat til 0.30.
I min MouseEnter event bliver opacity sat til 1 på mine Ellipse objecter.
I min MouseLeave event laver den en Animation af Opacity fra 1.0 til 0.30 ... virker fint.
Mit problem opstår når jeg sætter min Opacity anden gang jeg laver en mouse over på mine objecter ... så bliver den ikke sat til 1 ... and then i'm lost ...
Hvad går der galt .. ?
Alt kode er med herunder:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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.Windows.Media.Animation;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public const double OPACITY_NORMAL = 0.35;
public const double OPACITY_OVER = 1.0;
public const int BORDERTHICKNESS_OVER = 5;
public Window1()
{
InitializeComponent();
Random r = new Random();
List<Village> list = new List<Village>();
Village v;
for (int i = 0; i < 200; i++)
{
v = new Village();
v.X = r.Next(0, 400);
v.Y = r.Next(0, 400);
v.Population = r.Next(0, 1200);
list.Add(v);
}
Ellipse e;
SolidColorBrush sb = new SolidColorBrush();
sb.Color = Colors.Red;
double d = (double)35 / 1200;
double size;
foreach (var item in list)
{
size = d * item.Population;
if (size < 5)
size = 5;
e = new Ellipse();
e.Stroke = sb;
e.Tag = item;
e.Width = size;
e.Height = size;
e.Opacity = OPACITY_NORMAL;
e.Fill = sb;
e.MouseEnter += new MouseEventHandler(e_MouseEnter);
e.MouseLeave += new MouseEventHandler(e_MouseLeave);
Canvas.SetLeft(e, item.X);
Canvas.SetTop(e, item.Y);
canvas1.Children.Add(e);
}
}
void e_MouseLeave(object sender, MouseEventArgs e)
{
Ellipse el = sender as Ellipse;
if (el == null)
return;
el.Stroke = null;
// el.Opacity = OPACITY_NORMAL;
Canvas.SetZIndex(el, 1);
info.Visibility = Visibility.Hidden;
DoubleAnimation da = new DoubleAnimation(OPACITY_OVER, OPACITY_NORMAL, new Duration(TimeSpan.FromSeconds(1)));
el.BeginAnimation(Ellipse.OpacityProperty, da, HandoffBehavior.SnapshotAndReplace);
}
SolidColorBrush ringBrush = new SolidColorBrush() { Color = Colors.Black };
void e_MouseEnter(object sender, MouseEventArgs e)
{
Ellipse el = sender as Ellipse;
if(el == null)
return;
el.Stroke = ringBrush;
// el.SetValue(Ellipse.StrokeThicknessProperty, 1);
Canvas.SetZIndex(el, 100);
el.Opacity = OPACITY_OVER;
// Her bliver min Opacity ikke sat ... før end jeg fjerner musen og min animation start i MouseLeave
System.Diagnostics.Debug.WriteLine("Opacity sat");
el.StrokeThickness = BORDERTHICKNESS_OVER;
System.Diagnostics.Debug.WriteLine("Border sat");
Village v = el.Tag as Village;
if (v == null)
return;
System.Diagnostics.Debug.WriteLine(string.Format("Fandt village X: {0}, Y:{1}", v.X, v.Y));
info.Visibility = Visibility.Visible;
X.Content = string.Format("X: {0}", v.X);
Y.Content = string.Format("Y: {0}", v.Y);
Point p1 = Mouse.GetPosition(root);
Point p2 = Mouse.GetPosition(el);
// System.Diagnostics.Trace.WriteLine("X: " + p2.X.ToString() + ", Y: " + p2.Y.ToString());
Canvas.SetLeft(info, p1.X - p2.X + el.Width);
Canvas.SetTop(info, p1.Y - p2.Y + el.Width);
}
private void btnZoomOut_Click(object sender, RoutedEventArgs e)
{
zoom.ScaleX -= 0.2;
zoom.ScaleY -= 0.2;
}
private void btnZoomIn_Click(object sender, RoutedEventArgs e)
{
zoom.ScaleX += 0.2;
zoom.ScaleY += 0.2;
}
private void btnReInit_Click(object sender, RoutedEventArgs e)
{
}
}
class Village
{
public int X { get; set; }
public int Y { get; set; }
public int Population { get; set; }
}
}