如何在c#WPF中以离散步骤更改椭圆的填充颜色

时间:2015-02-18 22:28:59

标签: c# wpf

我有一个名为序列的布尔值列表。我想根据列表的值更改形状的颜色,也就是说,我想迭代列表的值,并在每次偶然发现True时用某种颜色(例如黄色)填充形状每当我偶然发现一个假值时,改变颜色并改变颜色(蓝色)。我试过这样做:

foreach(bool element in Sequence)
{
    if(element){ ellipse.Fill = new SolidColorBrush(Colors.Yellow); }
    else{ ellipse.Fill = new SolidColorBrush(Colors.Blue); }
    int milisecond = 200;
    Thread.Sleep(miliseconds);
}

但是颜色不会交替出现。

这是XAML:

`<Ellipse x:Name="elipse" Height="100" Margin="151,52,0,0" Stroke="Black" Width="100" /> `

我需要一个触发器吗?我做错了什么? 提前谢谢你,如果有些事情看起来很有趣,请原谅我的坏英语。

1 个答案:

答案 0 :(得分:1)

foreach(bool element in Sequence)
{
    if(element){ ellipse.Fill = new SolidColorBrush(Colors.Yellow); }
    else{ ellipse.Fill = new SolidColorBrush(Colors.Blue); }
    int milisecond = 200;
    Thread.Sleep(miliseconds);
}

在UI线程上同步运行 。因此,UI永远不会有机会更新颜色。改为使用计时器。

当然,您不能foreach,因为您必须跟踪当前的索引。 的一种方法是保留当前代码,但用Thread.Sleep替换await Task.Delay

(Peter Duniho道歉,他添加了这个代码示例,但这个答案似乎只是为了一个人而哭泣)

<强>&LT;编辑&gt;
基于async的看起来像这样(并且恕我直言,使用计时器):

foreach (bool element in Sequence)
{
    ellipse.Fill = new SolidColorBrush(element ? Colors.Yellow : Colors.Blue);
    await Task.Delay(200);
}

当然,为了能够使用await,需要将其使用的方法声明为async。遗憾的是,原始问题并未提供完整的方法或其签名,但可能OP可以自行研究async方法的使用并了解如何转换。
&LT; /编辑&gt;

整个用例似乎应该重新设计,但其中一个解决方案应该让你走得更远这个路径。请记住,如果您正在编写代码隐藏,那么您可能做错了。