Avatar billede Syska Mester
09. marts 2009 - 14:00 Der er 1 kommentar

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; }
    }
}

Avatar billede Syska Mester
09. marts 2009 - 14:52 #1
Løsning ...

En adnimation låser at man kan ændre det, da den stadig er aktiv.

Løsning ...
da.FillBehavior = FillBehavior.Stop;

Den må stå til suspend eller sådan noget siden det ikke virker uden den ...

Det gør så også at man skal huske at sætte hvad den skal stå til når animationen er færidg ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester