2010-08-28 102 views
0

我想设计一个系统界面,我有不同的控件(矩形)一个接一个地动画(发光或发光),并将消息发送到队列,因为他们动画 - 我是C#和WPF所以不太清楚如何appoach这个 - 任何出发点?使用WPF事件触发事件

编辑:

感谢您的例子 - 虽然不能完全理解它,我想出了以下,但仍然有一些问题:

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.ComponentModel; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    // public partial class MainWindow : Window 
    //{ 
    // public MainWindow() 
    //{ 
    // InitializeComponent(); 
    //DataContext = this; 
    //} 

    //} 

    public class Glow : INotifyPropertyChanged 
    { 
     private double m_glowSize; 
     public event PropertyChangedEventHandler PropertyChanged; 
     public double GlowSize 
     { 
      get { return m_glowSize; } 
      set 
      { 
       m_glowSize = value; 
       NotifyPropertyChanged("GlowSize"); 
      } 
     } 
     public void Window() 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 

     private void Canvas_MouseMove(object sender, MouseEventArgs e) 
     { 
      Canvas canvas = sender as Canvas; 
      if (canvas != null) 
      { 
       Point mousePosition = e.GetPosition(canvas); 
       GlowSize = 20 * (mousePosition.X/canvas.ActualWidth); 
      } 
     } 

     private void NotifyPropertyChanged(string s) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(s)); 
     } 
    } 
} 

问题似乎是这个块:

public void Window() 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 

DataContext = this;是做什么的,我该如何正确设置它?

+2

阅读关于触发器,数据触发器和事件触发器假设它们是开始的基础知识。另外,看看ObservableCollection和INotifyPropertyChanged这些东西在未来会有帮助。 – 2010-08-29 14:09:20

回答

2

嘿理查德,我收回了我以前的答案并更新了这个新的答案,希望它更有意义。另外,如果您想了解更多有关建议答案的信息,请使用“评论”选项。

基本上我刚刚在画布上添加了一个带有发光效果的矩形,然后将光环的大小限制到每当鼠标移过Canvas时我操作的属性。

请注意,为了这个工作,您的代码在类后面将需要实现位于System.ComponentModel命名空间中的INotifyPropertyChanged接口。您还需要确保窗口的datacontext设置正确。

Window XAML的内容:

<Canvas Background="DarkGray" 
     MouseMove="Canvas_MouseMove"> 
    <Rectangle Margin="40,40,0,0" 
       Width="200" 
       Height="200" 
       Fill="Gray" 
       Stroke="Black" 
       StrokeThickness="2"> 
     <Rectangle.BitmapEffect> 
      <OuterGlowBitmapEffect GlowColor="Goldenrod" 
            GlowSize="{Binding Path=GlowSize}"/> 
     </Rectangle.BitmapEffect> 
    </Rectangle> 
</Canvas> 
</Window> 

代码隐藏我的窗口:

public class Window1 : Window, INotifyPropertyChanged 
{ 
    private double m_glowSize; 
    public double GlowSize 
    { 
     get { return m_glowSize; } 
     set 
     { 
      m_glowSize = value; 
      NotifyPropertyChanged("GlowSize"); 
     } 
    } 

    public Window1() //this is my class constructor 
    { 
     DataContext = this; 
     InitializeComponent(); 
    } 

    private void Canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     Canvas canvas = sender as Canvas; 
     if (canvas != null) 
     { 
      Point mousePosition = e.GetPosition(canvas); 
      GlowSize = 20 * (mousePosition.X/canvas.ActualWidth); 
     } 
    }  

    private void NotifyPropertyChanged(string s) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(s)); 
    } 
} 

作为DataContext的一个非常基本的解释,你可以把它作为对象,该对象的绑定将寻求它们的绑定属性。在这个例子中,我们要确保窗口的XAML中的绑定可以在它的代码隐藏文件中找到。

此外,如果你还没有。看看这个 http://msdn.microsoft.com/en-us/library/aa970268.aspx

我发现它非常有用,当我第一次开始

希望它能帮助。

+0

嗨瓦尔,这有助于启动 - 我的问题仍然是如何以及何时调用我的课程,发送消息到队列。我还需要一次点击一个按钮来动画一个矩形。问题是我必须在三周内提出这个工作 - 所以学习的时间不是真的。但是当我有更多时间时,你帮助开始了。 欢呼 – migarich 2010-09-02 13:13:47

+0

我不是100%确定你的排队是什么意思。你只是想让每个矩形能够在鼠标悬停在给定位置时显示一条消息?如果要将矩形动画更改为onclick,则可以使用MouseLeftButtonUp事件而不是MouseOver。 否则,如果你想要的只是一个响应单个按钮的动画序列,也许你会更好地使用另一种语言,如Flash – Val 2010-09-03 09:14:13

+0

嗨瓦尔,让我解释一下。我有一个消息QUEue(MSMQ)不确定你是否熟悉这种(如果你喜欢,那种存储方式)我正在模拟轨道周围的列车运动。每当矩形改变颜色(意味着列车在那里)时,我都有一个方法添加到该消息队列中。动画现在正在工作(谢谢),但需要触发消息(即:在这里矩形ID:1) - 可以这样做吗? 我可以发送代码,如果你喜欢。 – migarich 2010-09-03 10:56:24