2009-05-04 34 views
12

Chúng tôi có hai TextBlocks như thế này: (chúng tôi sử dụng .NET FW 3,0)Bắt buộc kiểm soát WPF để làm mới?

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

Hai TextBlocks hoạt động tốt trên hệ điều hành-es khác, nhưng đôi khi bỏ lỡ trên Windows XP Trang chủ Phiên bản với SP3. Chúng tôi đã thử nhiều cách để làm mới chúng, nhưng thất bại.

Chúng tôi đã thử:

  1. UpdateLayout
  2. InvalidateVisual
  3. Thay đổi các thiết lập tài sản văn bản trong mã sang chế độ ràng buộc.

Làm cách nào để buộc các kiểm soát này làm mới?

+1

(x như UIElement) .InvalidateMeasure() – 0x4f3759df

Trả lời

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

Nó hoạt động tốt.

+0

Whats 'NoArgsHandle' tôi có cần tạo một lớp cho nó không? – raym0nd

4

Cách để thực hiện điều khiển cập nhật trực tiếp trong WPF là bằng dữ liệu HaiWay. Vì vậy, hãy chắc chắn rằng tất cả các thuộc tính viewModel mà bạn liên kết là Dependency Properties hoặc thực hiện INotifyPropertyChanged (và được xử lý đúng) và cả Binding.Mode = TwoWay của chúng.

Check-out Rudi Grobler 's 10 điều tôi không biết về dữ liệu WPF ràng buộc

Một số bài viết liên kết dữ liệu:

  1. WPF Data Binding - Part 1 By Joel Ngà Johnson alt text
  2. Moving Toward WPF Data Binding One Step at a Time By Josh Smith
+0

Tôi không nghĩ điều này có thể giải quyết được vấn đề, bởi vì chúng tôi đã thử ràng buộc một chiều. –

16

Điều này phù hợp với chúng tôi mà không cần tạo chủ đề mới. Nó lên lịch cho hành động để bắt đầu khi tất cả các ràng buộc đã tự cập nhật trước.

  Application.Current.Dispatcher.BeginInvoke(
       DispatcherPriority.Background, 
       new Action(() => 
        { 
         // Do something here. 
        })); 
Các vấn đề liên quan