Question

Nous avons deux blocs de texte comme ceci: (nous avons utilisé .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>

et

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

Ces deux textblocks fonctionnent bien sur d'autres systèmes d'exploitation, mais manquent parfois sous Windows XP Home Version avec SP3. Nous avons essayé de nombreuses manières de les actualiser, mais nous avons échoué.

Nous avons essayé:

  1. UpdateLayout
  2. InvalidateVisual
  3. Modification de la propriété set Text du code en mode de liaison.

Comment forcer l'activation de ces contrôles?

Était-ce utile?

La solution 2


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

Cela fonctionne bien.

Autres conseils

Cela fonctionne pour nous sans qu'il soit nécessaire de créer un nouveau fil. Il planifie le démarrage de l'action lorsque toutes les liaisons se sont mises à jour en premier.

           Application.Current.Dispatcher.BeginInvoke(
                DispatcherPriority.Background,
                new Action(() =>
                    {
                        // Do something here.
                    }));

La méthode de mise à jour des contrôles en direct dans WPF consiste à établir une liaison de données TwoWay. Assurez-vous donc que toutes les propriétés viewModel auxquelles vous vous associez sont des propriétés de dépendance ou implémentez INotifyPropertyChanged (et gérées correctement), ainsi que leurs propriétés Binding.Mode = TwoWay.

Découvrez Rudi Grobler 's 10 choses que je ne connaissais pas sur la liaison de données WPF

Certains articles de liaison de données:

  1. Liaison de données WPF - Partie 1 Par Joel Ivory Johnson alt text
  2. Évolution vers la liaison de données WPF une étape à la fois Par Josh Smith
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top