首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF、不透明度和线程

WPF、不透明度和线程
EN

Stack Overflow用户
提问于 2011-05-04 21:48:01
回答 1查看 964关注 0票数 1

我有两个重叠(位置相同,大小相同) MediaElements。它们将包含图像。一个元素的不透明度将设置为1.0,另一个元素的不透明度将设置为0.0。这里的想法是一个简单的过渡幻灯片类型的交易。当显示下一张幻灯片时,背景元素加载图片,两个元素的不透明度逐渐切换。

我尝试(成功地)使用System.Timers实现这个行为,结果发现在同一个应用程序中拥有超过一些任意数量的计时器会导致.NET随机生成并将timer_elapsed的控制权割让给几个不同的线程。这导致了难以预料的结果,使我对自己的理智产生了怀疑。

所以,我决定做同样的事情,但是使用System.Threads和他们的睡眠功能。不管出于什么原因,逐渐循环不透明与疯狂的计时器完美地工作,但对线程彻底失败。但以一种荒谬的方式失败了。这两个元素的不透明度确实有变化,但两者之间没有差别。元素以1.0或0.0的不透明度显示。否则,我会注意到,大约一半的照片没有被循环通过。

在进行了大量的googling搜索之后,我认为不透明更改的线程的优先级在某种程度上阻止了UI元素的立即呈现。但是,我回忆说,因为我在媒体元素上使用dispatcher调用,所以所有的操作都是在主线程上进行的,所以不会有什么区别。

考虑以下代码:https://gist.github.com/956093

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-04 22:22:53

正如建议的那样,您应该使用本机动画;我以前也遇到过这个线程问题,通常我试图避免使用Dispatcher,如果必须的话,我几乎只使用它们来修改数据(例如,不能在后台线程中修改ObservableCollection,实际上不知道任何其他示例)。

您仍然可以使用普通的线程,如果您使用绑定更新UIElements,它们可以很好地工作,这样就可以很好地绕过调度问题。

动画示例:

代码语言:javascript
复制
<Grid Name="testGrid" Tag="2">
    <Grid.Resources>
        <Storyboard x:Key="FadeAnim2to1">
            <DoubleAnimation Storyboard.Target="{x:Reference img1}"
                             Storyboard.TargetProperty="Opacity"
                             Duration="0:0:1" To="1"/>
            <DoubleAnimation Storyboard.Target="{x:Reference img2}"
                             Storyboard.TargetProperty="Opacity"
                             Duration="0:0:1" To="0"/>
        </Storyboard>
        <Storyboard x:Key="FadeAnim1to2">
            <DoubleAnimation Storyboard.Target="{x:Reference img1}"
                             Storyboard.TargetProperty="Opacity"
                             Duration="0:0:1" To="0"/>
            <DoubleAnimation Storyboard.Target="{x:Reference img2}"
                             Storyboard.TargetProperty="Opacity"
                             Duration="0:0:1" To="1"/>
        </Storyboard>
    </Grid.Resources>
    <Image x:Name="img1" Source="Images/Default.ico" Width="200" Height="200" Opacity="0"/>
    <Image x:Name="img2" Source="Images/Error.ico" Width="200" Height="200"/>
</Grid>
<Button Content="Fade" Click="Button1_Click"/>
代码语言:javascript
复制
private void Button1_Click(object sender, RoutedEventArgs e)
{
    Storyboard anim;
    if ((string)testGrid.Tag == "1") //This is just for brevity, you should of course not use the Tag to store state information, let alone number strings
    {
        anim = testGrid.Resources["FadeAnim1to2"] as Storyboard;
        testGrid.Tag = "2";
    }
    else
    {
        anim = testGrid.Resources["FadeAnim2to1"] as Storyboard;
        testGrid.Tag = "1";
    }
    anim.Begin();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5890251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档