このような2つのtextBlockがあります:(。NETFW 3.0を使用しました)
<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>
これらの2つのtextBlockは、他のOSでもうまく機能しますが、Windows XP Home Version with SP3)では見落とされることがあります。これらを更新する方法はたくさんありますが、失敗しました。
私たちは試しました:
これらのコントロールを強制的に更新するにはどうすればよいですか?
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();
それはうまくいきます。
これは、新しいスレッドを作成する必要なしに機能します。すべてのバインディングが最初に更新されたときに開始するアクションをスケジュールします。
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() =>
{
// Do something here.
}));
WPFでコントロールをライブ更新する方法は、TwoWayデータバインディングによるものです。したがって、バインドするすべてのviewModelプロパティが依存関係プロパティであるか、INotifyPropertyChangedを実装している(そして正しく処理されている)ことと、それらのBinding.Mode = TwoWayであることを確認してください。
チェックアウト Rudi Grobler のWPFデータバインディングについて私が知らなかった10のこと
いくつかのデータバインディング記事: