2009-05-04 6 views
12

Wir haben zwei Textblöcke wie folgt aus: (wir haben .NET FW 3,0)Erzwinge ein WPF-Steuerelement zum Aktualisieren?

<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> 

und

<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> 

Diese beiden Textblöcke funktionieren gut auf andere OS-es, aber manchmal fehlt auf dem Windows XP Home Version mit SP3. Wir haben viele Möglichkeiten versucht, diese zu aktualisieren, aber es ist fehlgeschlagen.

Wir haben versucht:

  1. UpdateLayout
  2. InvalidateVisual
  3. die Menge Text-Eigenschaft im Code geändert Modus zu binden.

Wie erzwingen diese Steuerelemente zu aktualisieren?

+1

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

Antwort

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(); 

Es funktioniert gut.

+0

Was ist 'NoArgsHandle' muss ich eine Klasse dafür erstellen? – raym0nd

4

Die Möglichkeit, Steuerelemente live zu aktualisieren, ist in WPF durch TwoWay-Datenbindung. Stellen Sie also sicher, dass alle viewModel-Eigenschaften, an die Sie binden, Abhängigkeitseigenschaften sind oder INotifyPropertyChanged implementieren (und korrekt gehandhabt werden) und dass Binding.Mode = TwoWay ist.

Check out Rudi Grobler ‚s 10 Dinge, die ich nicht über WPF Datenbindung

Einige Datenbindung Artikel wussten:

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

Ich glaube nicht, dass dies das Problem lösen könnte, weil wir Einweg Bindung versucht haben. –

16

Dies funktioniert für uns ohne die Notwendigkeit, einen neuen Thread zu erstellen. Es plant die Ausführung der Aktion, wenn alle Bindungen sich zuerst selbst aktualisiert haben.

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