I have a WPF application with a status bar.
<StatusBar Grid.Row="1" Height="23" Name="StatusBar1" VerticalAlignment="Bottom"> <TextBlock Name="TextBlockStatus" /> </StatusBar>
I want to display the text there and switch to the βWaitβ clockwise when I do a little work.
This code will update the cursor, but the StatusBar text is not updated ...
Cursor = Cursors.Wait TextBlockStatus.Text = "Loading..." System.Threading.Thread.Sleep(New TimeSpan(0, 0, 3)) TextBlockStatus.Text = String.Empty Cursor = Cursors.Arrow
Update
Inspired by Alexandra answer ...
It works if I do this, but I'm not completely happy with this solution. Is there an easier way?
Delegate Sub Load1() Sub Load2() System.Threading.Thread.Sleep(New TimeSpan(0, 0, 3)) End Sub Dim Load3 As Load1 = AddressOf Load2 Sub Load() Cursor = Cursors.Wait TextBlockStatus.Text = "Loading..." Dispatcher.Invoke(DispatcherPriority.Background, Load3) TextBlockStatus.Text = String.Empty Cursor = Cursors.Arrow End Sub
I would prefer it to look something like this ...
Sub Load() Cursor = Cursors.Wait TextBlockStatus.Text = "Loading..." 'somehow put all the Dispatcher, Invoke, Delegate, AddressOf, and method definition stuff here' TextBlockStatus.Text = String.Empty Cursor = Cursors.Arrow End Sub
Or even better ...
Sub Load() Cursor = Cursors.Wait ForceStatus("Loading...") System.Threading.Thread.Sleep(New TimeSpan(0, 0, 3)) ForceStatus(String.Empty) Cursor = Cursors.Arrow End Sub Sub ForceStatus(ByVal Text As String) TextBlockStatus.Text = Text 'perform magic' End Sub
Update
I also tried associating a TextBlock with a public property and implementing INotifyPropertyChanged as IanGilham . This one does not work .
XAML:
<TextBlock Text="{Binding Path=StatusText}"/>
Visual Basic:
Imports System.ComponentModel Partial Public Class Window1 Implements INotifyPropertyChanged Private _StatusText As String = String.Empty Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged Property StatusText() As String Get Return _StatusText End Get Set(ByVal value As String) _StatusText = value OnPropertyChanged("StatusText") End Set End Property Shadows Sub OnPropertyChanged(ByVal name As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) End Sub ... Sub Load() ... Cursor = Cursors.Wait StatusText = "Loading..." System.Threading.Thread.Sleep(New TimeSpan(0, 0, 3)) StatusText = String.Empty Cursor = Cursors.Arrow ... End Sub ...