2012-07-21 52 views
0

变化问题是只有活动结束后,WPF不保存更改如何保存在WPF事件系

//code 
private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    for (int ii = 0; ii <= 5; ii++) 
    { 
     Rectangle rectr = (Rectangle)FindName("rect" + ii); 
     rectr.Fill = Brushes.Black; 
     // need some thing to save changes here 
     Thread.Sleep(100); 
    } 

} 

的问题是如何保存更改

所有我需要改变每个矩形的背景色和睡一段时间再改下矩形

+1

你在这里试图完成什么?你想要保存什么变化? – Bernard 2012-07-21 15:42:29

+0

我需要的所有东西 更改每个矩形的背景颜色并休息一段时间,然后更改下一个矩形 – 2012-07-21 15:51:35

+0

当您运行此操作时会发生什么? – 2012-07-21 16:11:06

回答

0

尝试类似的东西:

XAML文件:

<Window x:Class="RectangleNS.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="30" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 

     <Button Content="Change Color" Click="Button_Click" /> 

     <StackPanel Grid.Row="1" > 
      <Rectangle Name="rect1" Fill="Red" Height="50" /> 
      <Rectangle Name="rect2" Fill="Yellow" Height="50" /> 
      <Rectangle Name="rect3" Fill="Green" Height="50" /> 
      <Rectangle Name="rect4" Fill="AliceBlue" Height="50" /> 
      <Rectangle Name="rect5" Fill="DarkTurquoise" Height="50" /> 
     </StackPanel>   
    </Grid> 
</Window> 

代码隐藏文件:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.ComponentModel; 
using System.Threading; 

namespace RectangleNS 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      BackgroundWorker bw = new BackgroundWorker(); 

      Grid grid = (Grid)(sender as Button).Parent; 

      bw.DoWork += (o, ee) => 
      { 
       for (int i = 1; i <= 5; i++) 
       { 
        Rectangle rectr = null; 
        Application.Current.Dispatcher.Invoke((Action)(() => { rectr = VTHelper.FindVisualChildByName<Rectangle>(grid, "rect" + i); })); 
        Application.Current.Dispatcher.Invoke((Action)(() => { rectr.Fill = Brushes.Black; }));     
        Thread.Sleep(100); 
       } 
      }; 

      bw.RunWorkerAsync(); 
     } 
    } 

    public static class VTHelper 
    { 
     public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
      { 
       var child = VisualTreeHelper.GetChild(parent, i); 
       string controlName = child.GetValue(Control.NameProperty) as string; 
       if (controlName == name) 
       { 
        return child as T; 
       } 
       else 
       { 
        T result = FindVisualChildByName<T>(child, name); 
        if (result != null) 
         return result; 
       } 
      } 
      return null; 
     } 
    } 
} 
+0

**谢谢**它运行成功:) – 2012-07-21 23:20:15

0

Button_Click由UI线程调用,你不应该做任何需要比在它几毫秒以上,让它成为睡100毫秒。在此期间不处理消息,您的界面无响应,并且您的应用程序被系统视为“挂起”。

那么,那long processing task should be handled by another thread。用这个代替你的代码,它应该适合你 -

for (int ii = 0; ii <= 5; ii++) 
      { 
       BackgroundWorker backgroundWorker = new BackgroundWorker(); 
       backgroundWorker.DoWork += (s, args) => 
        { 
         args.Result = (int)args.Argument; 
         Thread.Sleep(100); 
        }; 
       backgroundWorker.RunWorkerCompleted += (s, args) => 
       { 
        int value = (int)args.Result; 
        Rectangle rectr = (Rectangle)FindName("rect" + value); 
        rectr.Fill = Brushes.Black; 
       }; 
       backgroundWorker.RunWorkerAsync(ii); 
      } 
+0

对不起,它没有运行成功 和**感谢您的帮助** – 2012-07-21 23:21:08

+0

您面临什么问题?因为它在我的工作很好。 – 2012-07-22 05:28:41