2011-08-11 66 views
0

我點擊邊框的按鈕背景是藍色的,一秒後它應該是紅色的。它是紅色但不是藍色。爲什麼?如何在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

因爲你佔用與循環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(); 
} 
0

WPF不刷新你的佈局immedialty此行之後

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; 
} 
0

首先,200毫秒是第二秒,而不是1秒。

你只看到紅色的原因是因爲當你的代碼完成時,邊框是紅色的。您的代碼在循環之前或循環中不會產生控制,因此藍色不會被繪製。

如果你想要的,你控制,你可能會得到更令人滿意的結果,如果按照這個答案的例子,以動畫的背景色Animated background control in WPF?

如果你喜歡的顏色立即改變,那麼你有幾種辦法做到這一點,就像我的同事回答的那樣。如果你想讓氣味特別辛辣,你可以使用舊的System.Windows.Forms.Application.DoEvents,我相信這仍然會奏效。

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> 

您可以修改它來滿足自己的喜好,使其資源的一部分,這樣可以重複使用等,所有這一切不碰你的代碼!

+0

如果選擇了分組中的其他控件(試圖實現高亮,現在轉到C#路線),您是否知道取消顏色? – JulieC

+0

對不起,延遲迴復。嘗試使用Style.Triggers。爲屬性IsFoused添加一個觸發器並且值「true」。將setter添加到觸發器並將背景設置爲綠色。當Isfocused變爲false時,不需要取消顏色,因爲觸發器也會恢復原始背景。 –