2009-05-04 23 views
12

我々はこのような2つのTextBlockています(私たちは.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> 

これら二つのTextBlockは、他のOS-ES上でうまく動作しますが、時々、Windows XP上で欠場SP3のホームバージョン。私たちはこれらをリフレッシュするために多くの方法を試しましたが、失敗しました。

我々は試してみました:

  1. をUpdateLayout
  2. InvalidateVisual
  3. は、モードを結合するコードで設定されたTextプロパティを変更しました。

これらのコントロールを強制的にリフレッシュする方法を教えてください。

+1

.InvalidateMeasure() – 0x4f3759df

答えて

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

4

WPFでコントロールのライブ更新を行う方法は、TwoWayデータバインディングによるものです。したがって、バインドするすべてのviewModelプロパティがDependency Propertiesであることを確認するか、INotifyPropertyChangedを実装して正しく処理し、Binding.Mode = TwoWayを実装してください。

さんRudi Grobler私はいくつかのデータバインディング記事

を結合WPFデータについては知らなかった10事柄チェックアウト:ジョシュ・スミスではジョエル・アイボリー・ジョンソン

  1. WPF Data Binding - Part 1alt text
  2. Moving Toward WPF Data Binding One Step at a Time
+0

(UIElementのように、X)私たちは一方向結合しようとしているので、これは、問題を解決できるとは思いません。 –

16

新しいスレッドを作成する必要はありません。すべてのバインディングが最初に更新されたときにアクションが開始されるようにスケジューリングします。

  Application.Current.Dispatcher.BeginInvoke(
       DispatcherPriority.Background, 
       new Action(() => 
        { 
         // Do something here. 
        })); 
関連する問題