2009-05-04 16 views
12

Abbiamo due TextBlocks in questo modo: (abbiamo usato .NET FW 3,0)Forza un controllo WPF da aggiornare?

<TextBlock Grid.Column="0" Name="tabName" Style="{StaticResource textBlockBarStyle}" HorizontalAlignment="Left"> 
    <TextBlock.Margin> 
     <Binding Converter="{StaticResource dpiConverter}"> 
      <Binding.ConverterParameter> 
       <Thickness Left="3" Top="6" Right="0" Bottom="0"/> 
      </Binding.ConverterParameter> 
     </Binding> 
    </TextBlock.Margin> 
</TextBlock> 

e

<TextBox x:Name="txtBoxHelp" 
      IsReadOnly="True" Style="{DynamicResource txtBoxHelpStyle}" 
      IsTabStop="False" 
      Text="some text" MouseLeftButtonDown="txtBoxHelp_MouseLeftButtonDown"> 
    <TextBox.Margin> 
     <Binding Converter="{StaticResource dpiConverter}"> 
      <Binding.ConverterParameter> 
       <Thickness Left="7" Top="0" Right="0" Bottom="0"/> 
      </Binding.ConverterParameter> 
     </Binding> 
    </TextBox.Margin> 
</TextBox> 

Questi due TextBlocks funzionano bene su altri OS-es, ma a volte manca in Windows XP Versione Home con SP3. Abbiamo provato molti modi per aggiornarli, ma non ci siamo riusciti.

Abbiamo provato:

  1. UpdateLayout
  2. InvalidateVisual
  3. Cambiato l'insieme di proprietà Text nel codice in modalità binding.

Come forzare questi controlli per l'aggiornamento?

+1

(x come UIElement) .InvalidateMeasure() – 0x4f3759df

risposta

4

Thread thread = new Thread(new ThreadStart(delegate() 
       { 
        Thread.Sleep(200); // this is important ... 
        try 
        { 
         this.Dispatcher.BeginInvoke(DispatcherPriority.Send, 
          new NoArgsHandle(delegate() 
          { 
           // do something, set .Text = "some text" 
          })); 
        } 
        catch { } 
       })); 
       thread.Name = "thread-UpdateText"; 
       thread.Start(); 

Funziona bene.

+0

Che cosa è 'NoArgsHandle' ho bisogno di creare una classe per questo? – raym0nd

4

Il modo per rendere l'aggiornamento in tempo reale dei controlli in WPF è tramite l'associazione dati TwoWay. Quindi assicurati che tutte le proprietà viewModel a cui ti colleghi siano Proprietà dipendenza o implementino INotifyPropertyChanged (e gestite correttamente) e che Binding.Mode = TwoWay.

Partenza Rudi Grobler s' 10 cose che non sapevo di associazione dati WPF

Alcuni articoli di associazione dati:

  1. WPF Data Binding - Part 1 da Joel Ivory Johnson alt text
  2. Moving Toward WPF Data Binding One Step at a Time Con Josh Smith
+0

Io non credo che questo potrebbe risolvere il problema, perché abbiamo cercato di rilegatura a senso unico. –

16

Questo funziona per noi senza la necessità di creare un nuovo thread. Pianifica l'azione da avviare quando tutti i binding si sono prima aggiornati.

  Application.Current.Dispatcher.BeginInvoke(
       DispatcherPriority.Background, 
       new Action(() => 
        { 
         // Do something here. 
        }));