我点击边框的按钮背景为蓝色,一秒后它应该是红色。它是红色但不是蓝色。为什么?
<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;
}
答案 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
,我相信这仍然可行。