当前位置:编程学习 > C#/ASP.NET >>

CompositionTarget.Rendering 事件

这是“通过CompositionTarget创建对象移动动画”的代码。
代码内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Game
{
    public partial class CompositionTarget : UserControl
    {
        /// <summary>
        /// 填充色为蓝色,宽、高、圆角X、Y各50的矩形
        /// </summary>
        Rectangle rectangle = new Rectangle()
        {
            Fill = new SolidColorBrush(Colors.Blue),
            Width = 50,
            Height = 50,
            RadiusX = 50,
            RadiusY = 50
        };
        public CompositionTarget()
        {
            InitializeComponent();
            //将矩形添加进画布容器中
            LayoutRoot.Children.Add(rectangle);
            //注册画布容器的鼠标左键点击事件
            LayoutRoot.MouseLeftButtonDown+=new MouseButtonEventHandler(LayoutRoot_MouseLeftButtonDown);
        }
        bool isRendering = false;//是否启动了刷新
        double speed = 10;  //每次移动10像素
        double xSpeed, ySpeed; //X、Y方向的速度
        int num; //需要移动次数
        int count; //统计移动次数

        private void LayoutRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (!isRendering)
            {
                CompositionTarget.Rendering += new EventHandler(Rendering);

问题一:“CompositionTarget.Rendering”有红线提示?不是有CompositionTarget.Rendering 事件吗,怎么还提示红线说不存在?

                
            isRendering = true;
            }
            Point start = new Point(Canvas.GetLeft(rectangle),Canvas.GetTop(rectangle));
            Point end = e.GetPosition(LayoutRoot);
            double distance = Math.Sqrt(Math.Pow((end.X-start.X),2)+Math.Pow((end.Y-start.Y),2));
            xSpeed = (end.X - start.X) * speed / distance;
            ySpeed = (end.Y - start.Y) * speed / distance;
            num=(int)(distance/speed);
            count = 0;
        }

        private void Rendering(object sender, EventArgs e)
        {
问题二:这个事件是怎么触发执行的,没有循环语句。“CompositionTarget.Rendering 事件”会一直触发吗?

            double x = Canvas.GetLeft(rectangle);
            double y = Canvas.GetTop(rectangle);
            Canvas.SetLeft(rectangle,x+xSpeed);
            Canvas.SetTop(rectangle,y+ySpeed);
            if (count == num)
            {
                CompositionTarget.Rendering -= Rendering;
                isRendering = false;
            }
            count++;
        }
    }
} --------------------编程问答-------------------- --------------------编程问答-------------------- 问题一: CompositionTarget 与你定义的类名重叠了, 请使用System.Windows.Media.CompositionTarget

问题二: Rendering 会一直触发 --------------------编程问答-------------------- 补充 
Rendering (相当于Flash中的Enter_Frame,在进入每帧时触发) --------------------编程问答--------------------
引用 2 楼 windhuan 的回复:
问题一: CompositionTarget 与你定义的类名重叠了, 请使用System.Windows.Media.CompositionTarget

问题二: Rendering 会一直触发


和类名重叠了就会出现这种情况吗?为什么?能详细介绍下吗? --------------------编程问答-------------------- using System.Windows.Media;
namespace Game

这2个命名空间下都有CompositionTarget

vs编译器优先认为是Game命名空间下的 --------------------编程问答-------------------- CompositionTarget代表显示图面,因为画面需要不停的刷新,所有会一直触发该事件。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,