繁体   English   中英

如何在C#WPF中以不连续的步骤更改椭圆的填充颜色

[英]How to change a fill color for an ellipse in discrete steps in c# WPF

我有一个名为Sequence的布尔值列表。 我想根据列表的值更改形状的颜色,也就是说,我每次遍历True时都要遍历列表的值并用某种颜色(例如黄色)填充形状每次我发现False值时,更改填充的颜色(变为蓝色)。 我试图这样做:

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" /> `

我需要扳机吗?我在做什么错? 预先谢谢您,如果有什么好笑的话,请原谅我的英语不好。

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的道歉,他添加了此代码示例,但是这个答案似乎正在呼唤一个人)

<编辑>
基于async的代码看起来像这样(恕我直言,优于使用计时器):

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

当然,要能够使用await ,使用它的方法需要声明为async 不幸的是,最初的问题并没有提供完整的方法及其签名,但是大概OP可以自己研究async方法的使用并查看如何进行转换。
</编辑>

整机采用案例似乎应该重新设计,但这些解决方案之一应该让你进一步走上这条道路。 请记住,如果您在编写代码隐藏程序,则可能做错了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM