2009-05-04 16 views
12

Tenemos dos bloques de texto así: (utilizamos .NET FW 3,0)¿Forzar un control WPF para actualizar?

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

y

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

Estos dos bloques de texto funcionan bien en otros sistemas operativos-es, pero a veces se pierda en el Windows XP Versión de inicio con SP3. Hemos intentado muchas formas de actualizarlos, pero hemos fallado.

Probamos:

  1. UpdateLayout
  2. InvalidateVisual
  3. ha cambiado el conjunto de propiedades de texto en el código a modo de unión.

Cómo forzar que estos controles se actualicen?

+1

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

Respuesta

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

Funciona bien.

+0

¿Qué es 'NoArgsHandle' ¿Necesito crear una clase para él? – raym0nd

4

La forma de realizar controles de actualización en vivo en WPF es mediante el enlace de datos TwoWay. Así que asegúrese de que todas las propiedades de viewModel a las que se vincule sean Propiedades de dependencia o implemente INotifyPropertyChanged (y se maneje correctamente) y también que Binding.Mode = TwoWay.

Salida Rudi Grobler 's 10 cosas que no sabía acerca de los datos de WPF vinculante

Algunos artículos de enlace de datos:

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

No creo que esto podría resolver el problema, ya que hemos tratado de una vía de unión. –

16

Esto funciona para nosotros sin la necesidad de crear un nuevo hilo. Programa la acción para comenzar cuando todos los enlaces se hayan actualizado primero.

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