2009-05-04 308 views
12

我們有兩個的TextBlocks這樣的:(我們使用.NET FW 3.0)強制WPF控件刷新?

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

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

這兩個的TextBlocks其它OS-ES工作得很好,但有時錯過在Windows XP帶有SP3的家庭版本。我們嘗試了很多方法來刷新這些,但失敗了。

我們嘗試:

  1. UpdateLayout請
  2. InvalidateVisual
  3. 改變了一套Text屬性在代碼中結合模式。

如何強制這些控件刷新?

+1

(x作爲的UIElement).InvalidateMeasure() – 0x4f3759df 2011-11-08 17:55:45

回答

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

它運作良好。

+0

Whats`NoArgsHandle`我需要爲它創建一個類嗎? – raym0nd 2011-08-05 16:00:40

4

WPF中實時更新控件的方法是通過TwoWay數據綁定。所以確保你綁定到的所有viewModel屬性都是依賴屬性或實現INotifyPropertyChanged(並正確處理),並確保它們的Binding.Mode = TwoWay。

退房Rudi Grobler10件事情我不知道WPF數據綁定

一些數據綁定的文章:

  1. WPF Data Binding - Part 1通過喬爾象牙約翰遜alt text
  2. Moving Toward WPF Data Binding One Step at a Time由約什 - 史密斯
+0

我不認爲這可以解決這個問題,因爲我們已經嘗試單向綁定。 – 2009-05-04 13:57:32

16

這對我們而言無需創建新線程。它計劃在所有綁定首先更新自己時開始的操作。

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