WPF / Silverlight实时渲染模糊效果

时间:2012-12-26 12:47:03

标签: wpf multithreading silverlight dispatcher blur

在我的WPF项目中,我已经完成了点击一些UI元素这样的东西:

    void vb1_click(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        DispatcherTimer dt = new DispatcherTimer();
        dt.Interval = new TimeSpan(0, 0, 0, 0, 1000);
        dt.Tick += new System.EventHandler(dt_Tick);
        dt.Start();
    }

    void dt_Tick(object sender, System.EventArgs e)
    {
        for(int i = 0; i < 20; i++)
        {
            this.vb2_blur_eff.Radius = (double)i;
        }
    }

主要问题是:“我无法看到每秒模糊效果的每一步。程序处于空闲状态,当程序完成时,它为我提供了模糊UI元素的最后一步。

我不想要它,因为两个程序空闲都看起来很难看,我希望在每个时期看到渲染结果。

1 个答案:

答案 0 :(得分:2)

我看到的主要问题是你正在使用For循环设置你的模糊半径,所以它坐在那里曲柄达到最大然后将控制权返回给调度员然后更新它。我更喜欢用StoryBoard来做,但是你可以使用一个Timer来完成它并让Timer在每个tick上设置Radius,当它达到最大值然后停止时。您可以使用Timer的间隔来控制扩散速度。我正在使用一个名为count的类级别变量。

void vb1_click(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    DispatcherTimer dt = new DispatcherTimer();
    dt.Interval = new TimeSpan(0, 0, 0, 0, 20);
    dt.Tick += new System.EventHandler(dt_Tick);
    count = 0;
    dt.Start();
}

void dt_Tick(object sender, System.EventArgs e)
{
    DispatcherTimer tmr = (DispatcherTimer)sender;
    this.vb2_blur_eff.Radius = (double)count;
    if (count == 20)
    {
        tmr.Stop();
        tmr.Tick -= new System.EventHandler(dt_Tick);
    }

    count += 1;
}