2011-08-11 29 views
0

私は国境のボタンの背景をクリックして1秒後に赤くなるはずです。赤色ですが青色ではありません。どうして?WPFで1秒後にボーダーの背景色を変更するにはどうすればよいですか?

<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秒ではなく5秒です。

赤だけが表示されるのは、コードが完成したときに境界線が赤くなるためです。あなたのコードは、ループの前または途中でコントロールを生成しないので、青が描画されません。あなたはこの答えの例に従えば、あなたはおそらくはるかに満足のいく結果が得られますコントロールの背景色をアニメーション化したい場合は、すぐに色の変化を好む場合

Animated background control in WPF?

、あなたはにはいくつかの方法があります私の仲間の回答者によって詳述されているようにそれを起こさせてください。匂いが特に珍しい場合は、古いSystem.Windows.Forms.Application.DoEventsを使用することができますが、これはまだ動作すると思います。

1

WPFがXAML自体に似たようなことを許可するときにコードを書く理由は何ですか?あなたはそれがあなたのコードに触れずなどすべてのことを再利用できるようにITリソースの一部にし、あなたの好みに合わせて変更することができ、次の例

<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に1つのTriggerを追加し、値「true」を追加します。トリガーにセッターを追加し、背景を緑色に設定します。 Isfocusedがfalseになったときに元のバックグラウンドを復元するので、色を消す必要はありません。 –

関連する問題