我们有两个这样的textBlock :(我们使用.NET FW 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>
这两个textBlock在其他操作系统上运行良好,但有时会错过带有SP3的Windows XP Home版本。我们已经尝试了许多方法来刷新这些,但失败了。
我们尝试过:
如何强制刷新这些控件?
答案 0 :(得分:18)
这对我们有用,无需创建新线程。它会安排在所有绑定首次更新时开始的操作。
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() =>
{
// Do something here.
}));
答案 1 :(得分:4)
在WPF中进行控件实时更新的方法是使用TwoWay数据绑定。因此,请确保绑定到的所有viewModel属性都是依赖属性或实现INotifyPropertyChanged(并正确处理)以及它们的Binding.Mode = TwoWay。
查看Rudi Grobler 我不了解的有关WPF数据绑定的10件事
一些数据绑定文章:
答案 2 :(得分: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();
效果很好。
答案 3 :(得分:0)
我长期以来一直在为这个特定问题而苦苦挣扎,结合 Declan Taylor 的评论,Cooper Wu 提出的建议似乎非常接近最终解决方案。就我而言,它仍然没有完全解决,但它让我想到了这段代码:
Thread thread = new Thread(new ThreadStart(delegate ()
{
Thread.Sleep(200); // this is important ...
try
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Send,
new Action(delegate ()
{
DoSomething();
}));
}
catch { }
}));
thread.Name = "ThreadName";
thread.Start();
区别在于 NoArgsHandle 被 Action 替换,但委托仍然存在。 我对睡眠时间做了一些调整,但这只会减少几分之一秒。 我认为 thread.Name 是必要的,以避免获得多个具有相同名称的线程,但将其省略似乎不会导致任何问题。