2009-11-24 19 views
1

Что делать, если я хочу, чтобы текстовое поле представляло в реальном времени значение счетчика циклов в wpf?счетчик времени в реальном времени ouput wpf

Добавление данных рабочего раствора:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private delegate void UpdateTextBox(DependencyProperty dp, Object value); 
... 
private void MyMethod() 
{ 
    ... 
    int iMax=...; 
    ... 
    MyClass iMyClass = new MyClass(arguments); 
     this.DataContext = iMyClass; 
     UpdateTextBox updateTBox = new UpdateTextBox(textBlock1.SetValue); 
     for (int i = 1; i <= iMax; i++) 
     { 
      iMyClass.MyClassMethod(i); 
      Dispatcher.Invoke(updateTBox, System.Windows.Threading.DispatcherPriority.Background, new object[] { MyClass.MyPropertyProperty, iMyClass.myProperty }); 

     } 

Вот код, который я пытался в соответствии с вашим предложением, но он не работает, я получаю «0» написано в текстовом поле, поэтому я полагаю, что связывание в порядке, но цикл не работает. Я также сделал цикл для записи в другое текстовое поле непосредственно через textbox2.text = "a" внутри цикла, но он тоже не работал.

/// <summary> 
/// Interaction logic for Window1.xaml 
/// DOESNT WORK PROPERLY 
/// </summary> 
public partial class Window1 : Window 
{ 


    public Window1() 
    { 
     InitializeComponent(); 
     TestClass tTest = new TestClass(); 
     this.DataContext = tTest ; 
     tTest.StartLoop(); 
    } 
} 
public class TestClass : DependencyObject 
{ 
    public TestClass() 
    { 
     bwLoop = new BackgroundWorker(); 

     bwLoop.DoWork += (sender, args) => 
     { 

      // do your loop here -- this happens in a separate thread 
      for (int i = 0; i < 10000; i++) 
      { 
       LoopCounter=i; 
      } 
     }; 
    } 
    BackgroundWorker bwLoop; 

    public int LoopCounter 
    { 
     get { return (int)GetValue(LoopCounterProperty); } 
     set { SetValue(LoopCounterProperty, value); } 
    } 

    public static readonly DependencyProperty LoopCounterProperty = DependencyProperty.Register("LoopCounter", typeof(int), typeof(TestClass)); 

    public void StartLoop() 
    { 
     bwLoop.RunWorkerAsync(); 
    } 
} 

}

ответ

2
  1. Выполнить петлю в фоновом процессе (так что пользовательский интерфейс может обновляться в то время как цикл работает) и

  2. написать счетчик цикла в свойстве (DependencyProperty или CLR свойства с INotifyPropertyChanged), который привязан к TextBox в вашем пользовательском интерфейсе. Кроме того, вы можете напрямую изменить значение TextBox через Dispatcher.Invoke (это, однако, менее элегантно).

Помогает ли это? Не стесняйтесь просить разъяснений ...


пример кода (непроверенные), используя DependencyProperty (который должен быть привязан к TextBox):

BackgroundWorker bwLoop; 
public static readonly DependencyProperty LoopCounterProperty = 
    DependencyProperty.Register("LoopCounter", typeof(int), 
    typeof(Window1), new FrameworkPropertyMetadata(0)); 

public int LoopCounter { 
    get { return (int)this.GetValue(LoopCounterProperty); } 
    set { this.SetValue(LoopCounterProperty, value); } 
} 

private MyWindow() { 
    ... 
    bwLoop = new BackgroundWorker(); 

    bwLoop.DoWork += (sender, args) => { 
     ... 
     for (int i = 0; i < someLimit; i++) { 
      Dispatcher.Invoke(new Action(() => LoopCounter=i)); 
      System.Threading.Thread.Sleep(250); // do your work here 
     } 
    } 

    bwLoop.RunWorkerCompleted += (sender, args) => { 
     if (args.Error != null) 
      MessageBox.Show(args.Error.ToString()); 
    }; 
} 

private void StartLoop() { 
    bwLoop.RunWorkerAsync(); 
} 
+0

я сумел сделать это с DependancyProperty и диспетчером .Invoke. Не могли бы вы подробнее рассказать о первой возможности - запустить цикл в фоновом процессе и написать счетчик циклов в свойстве зависимости. это отличается от того, что я сделал? – butaro

+0

Я добавил пример кода, чтобы вы могли сравнить его с вашим кодом. Если вы добавите свой код в свой вопрос, я могу прокомментировать его. – Heinzi

+0

Я сделал, ясно, что я сделал? – butaro

0

вы можете использовать связывание данных для постоянного обновления текста.

Смежные вопросы