如何在WPF中一秒钟后更改边框的背景颜色?

时间:2011-08-11 07:59:25

标签: c# wpf

我点击边框的按钮背景为蓝色,一秒后它应该是红色。它是红色但不是蓝色。为什么?

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Border Width="111" Name="op" Height="111">
        <Button Name="opbtn" Click="opbtn_Click" Width="50" Height="23">click</Button>
    </Border>
</Window>

代码隐藏:

private void opbtn_Click(object sender, RoutedEventArgs e)
{
    op.BorderBrush = System.Windows.Media.Brushes.Blue;
    DateTime obj1 = new DateTime(); 
    DateTime obj2 = DateTime.Now.AddMilliseconds(200);
    while (obj2 > obj1)
    {
        obj1 = DateTime.Now;
    }
    op.BorderBrush = System.Windows.Media.Brushes.Red;
}

4 个答案:

答案 0 :(得分:4)

因为你正在使用该循环来绑定UI线程。 UI线程永远不会有机会将您的第一个更改应用到边框画笔,因为它正忙于在紧密循环中颠覆您的CPU。您应该使用DispatcherTimer或动画来实现此目的。使用DispatcherTimer

的示例
private void opbtn_Click(object sender, RoutedEventArgs e)
{
    op.BorderBrush = System.Windows.Media.Brushes.Blue;

    var dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Interval = TimeSpan.FromSeconds(1);
    dispatcherTimer.Tick += delegate
    {
        op.BorderBrush = System.Windows.Media.Brushes.Red;
        dispatcherTimer.Stop();
    };

    dispatcherTimer.Start();
}

答案 1 :(得分:1)

为什么在WPF允许XAML本身类似的事情时编写代码。请参阅以下示例

<StackPanel Orientation="Horizontal" Height="24">
    <Border BorderThickness="2">
        <Border.BorderBrush>
            <SolidColorBrush x:Name="BorderBrush" />
        </Border.BorderBrush>
        <Button Content="Click me" Width="64" Height="24">
            <Button.Triggers>
                <EventTrigger RoutedEvent="Button.Click">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation To="Red"
                                        Duration="0:0:1" 
                                        Storyboard.TargetName="BorderBrush"
                                        Storyboard.TargetProperty="Color"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Button.Triggers>
        </Button>
    </Border>
</StackPanel>

您可以根据自己的喜好对其进行修改,将其作为资源的一部分,以便可以重复使用等等。所有这些都不需要您的代码!

答案 2 :(得分:0)

WPF不会在此行后立即刷新您的布局

op.BorderBrush = System.Windows.Media.Brushes.Blue;

尝试使用op.UpdateLayout()

强制刷新布局
private void opbtn_Click(object sender, RoutedEventArgs e)
{
    op.BorderBrush = System.Windows.Media.Brushes.Blue;
    op.UpdateLayout();
    DateTime obj1 = new DateTime(); 
    DateTime obj2 = DateTime.Now.AddMilliseconds(200);
    while (obj2 > obj1)
    {
        obj1 = DateTime.Now;
    }
    op.BorderBrush = System.Windows.Media.Brushes.Red;
}

答案 3 :(得分:0)

首先,200毫秒是五分之一秒,而不是1秒。

您只看到红色的原因是,当您的代码完成时,边框为红色。您的代码在循环之前或循环期间不会产生控制,因此蓝色不会被绘制。

如果你想为你控制的背景颜色设置动画,如果你按照这个答案中的例子Animated background control in WPF?

那么你可能会得到更令人满意的结果

如果您更喜欢立即换色,那么您可以采用多种方式实现这一目标,正如我的回答者所详细说明的那样。如果您希望气味特别刺激,您可以使用旧的System.Windows.Forms.Application.DoEvents,我相信这仍然可行。