Принудительно обновить элемент управления WPF? - PullRequest
12 голосов
/ 04 мая 2009

У нас есть два таких текстовых блока: (мы использовали .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>

Эти два текстовых блока хорошо работают на других ОС, но иногда отсутствуют на Windows XP Home Version с пакетом обновления 3 (SP3). Мы пробовали много способов обновить их, но не смогли.

Мы пытались:

  1. UpdateLayout
  2. InvalidateVisual
  3. Изменено заданное свойство Text в коде на режим привязки.

Как заставить эти элементы управления обновляться?

Ответы [ 3 ]

18 голосов
/ 02 июня 2011

Это работает для нас без необходимости создавать новую тему. Он планирует запуск действия, когда все привязки сначала обновились.

           Application.Current.Dispatcher.BeginInvoke(
                DispatcherPriority.Background,
                new Action(() =>
                    {
                        // Do something here.
                    }));
4 голосов
/ 15 мая 2009

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

Хорошо работает.

4 голосов
/ 04 мая 2009

Способ оперативного обновления элементов управления в WPF - с помощью привязки данных TwoWay. Поэтому убедитесь, что все свойства viewModel, с которыми вы связываетесь, являются свойствами зависимости или реализуют INotifyPropertyChanged (и обрабатываются правильно), а также что их Binding.Mode = TwoWay.

Проверьте Руди Гроблер 10 вещей, которые я не знал о привязке данных WPF

Некоторые статьи, связанные с данными:

  1. Связывание данных WPF - часть 1 Джоэл Айвори Джонсон alt text
  2. Переход к привязке данных WPF один шаг за раз Джош Смит
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...