代码之家  ›  专栏  ›  技术社区  ›  kar

使用WPF的恒定颜色变化

c#
  •  1
  • kar  · 技术社区  · 12 年前

    嗨,我创建了4个矩形,每个矩形都有一种颜色。我现在正试图在按下时使用一个按钮来不断地随机改变这4个盒子的颜色(产生某种闪烁效果)。计算出了以下代码,但当我按下按钮时,程序卡住了。

    仔细阅读 System.Windows.Threading.DispatcherTimer 在这种情况下会有用,但不确定如何使用。正在寻求如何使用它的建议。谢谢。

    namespace testDisco
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            Random r;
            Rectangle[] rects;
    
            SolidColorBrush blue;
            SolidColorBrush red;
            SolidColorBrush yellow;
            SolidColorBrush green;
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                r = new Random();
                rects = new Rectangle[4];
    
                blue = new SolidColorBrush(Color.FromArgb(255,0,232,255));
                red = new SolidColorBrush(Color.FromArgb(129,56,56,255));
                yellow = new SolidColorBrush(Color.FromArgb(0,232,255,255));
                green = new SolidColorBrush(Color.FromArgb(176,207,176,255));
    
                rects[0] = rect1;
                rects[1] = rect2;
                rects[2] = rect3;
                rects[3] = rect4;
    
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                int randomNumber = r.Next(4);
                System.Windows.Threading.DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
    
                while (true)
                {
                    rects[randomNumber].Fill = red;
                }
            }
        }
    }
    
    2 回复  |  直到 12 年前
        1
  •  1
  •   tnw Christopher Z    12 年前

    你快到了。放慢循环速度,这样就不会使程序崩溃。

    System.Windows.Threading.DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
    dt.Interval = TimeSpan.FromSeconds(1); //or whatever interval you want
    
    dt.Tick += (s, e) =>
    { 
        rects[r.Next(0,3)].Fill = red;
    }
    

    尽管这最终只会让它们都变成红色,因为当你选择一个随机的矩形时,你并不是在选择随机的颜色。

        2
  •  -1
  •   SouthShoreAK    12 年前

    您可能需要查看此处定义的WPF动画系统:

    Animation Overview - MSDN

    在这里发布答案有点复杂,但不久前我在尝试做类似的事情时发现了这一点。不过,这比自己尝试做要好。事实上,甚至有 ColorAnimation 这可能正是你所需要的。