91 votes

WPF liaison avec StringFormat ne fonctionne pas sur les info-bulles

Le code suivant est une simple liaison qui lie le Texte du TextBlock nommé MyTextBlock à la zone de texte du Texte et l'info-bulle de la propriété en utilisant la même Liaison de notation:

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox    Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}"
             ToolTip="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}" />
</StackPanel>

La liaison utilise également le StringFormat propriété introduit avec .NET 3.5 SP1 qui fonctionne bien pour le Texte au-dessus de la propriété, mais semble être rompu pour l'info-bulle. Le résultat attendu est "Il est: Foo Bar", mais lorsque vous passez la souris sur la zone de texte, l'info-bulle affiche uniquement la liaison de la valeur, pas la chaîne de valeur mise en forme. Des idées?

165voto

Matt Hamilton Points 98268

Les info-bulles dans WPF peut contenir n'importe quoi, pas juste du texte, de sorte qu'ils fournissent une ContentStringFormat propriété pour les moments où vous voulez juste de texte. Vous aurez besoin d'utiliser la syntaxe étendue pour autant que je sais:

<TextBox ...>
  <TextBox.ToolTip>
    <ToolTip 
      Content="{Binding ElementName=myTextBlock,Path=Text}"
      ContentStringFormat="{}It is: {0}"
      />
  </TextBox.ToolTip>
</TextBox>

Je ne suis pas sûr à 100% sur la validité de liaison à l'aide de la ElementName la syntaxe à partir d'un ensemble bien comme ça, mais le ContentStringFormat est bien ce que vous cherchez.

26voto

MuiBienCarlota Points 150

C'est peut être un bug. Lorsque vous utilisez la syntaxe courte pour info-bulle:

<TextBox ToolTip="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}" />

StringFormat est de les ignorer, mais quand vous utiliser l'extension de la syntaxe:

<TextBox Text="text">
   <TextBox.ToolTip>
      <TextBlock Text="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}"/>
   </TextBox.ToolTip>
</TextBox>

Il fonctionne comme prévu.

5voto

Lucas Locatelli Points 41

Comme Matt m'a dit d'info-bulle peut contenir quoi que ce soit à l'intérieur donc, pour votre, vous pouvez lier une zone de texte.Texte à l'intérieur de votre info-bulle.

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}">
        <TextBox.ToolTip>
            <TextBlock>
                <TextBlock.Text>
                    <Binding ElementName=MyTextBlock Path="Text" StringFormat="It is: {0}" />
                </TextBlock.Text>
            </TextBlock>
        </TextBox.ToolTip>
    </TextBox>
</StackPanel>

Même vous, vous pouvez Empiler une grille à l'intérieur de la bulle d'aide et mise en page de votre texte si vous le souhaitez.

3voto

Athari Points 7821

Votre code peut être aussi court que celui-ci:

<TextBlock ToolTip="{Binding PrideLands.YearsTillSimbaReturns,
    Converter={StaticResource convStringFormat},
    ConverterParameter='Rejoice! Just {0} years left!'}" Text="Hakuna Matata"/>

Nous allons utiliser le fait que les Convertisseurs sont jamais ignorés, contrairement à StringFormat.

Mettre en StringFormatConverter.cs:

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace TLKiaWOL
{
    [ValueConversion (typeof(object), typeof(string))]
    public class StringFormatConverter : IValueConverter
    {
        public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (ReferenceEquals(value, DependencyProperty.UnsetValue))
                return DependencyProperty.UnsetValue;
            return string.Format(culture, (string)parameter, value);
        }

        public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}

Mettre ceci dans votre ResourceDictionary.xaml:

<conv:StringFormatConverter x:Key="convStringFormat"/>

-7voto

huseyint Points 8196

La suite est un long solution, mais il fonctionne.

<StackPanel>
  <TextBox Text="{Binding Path=., StringFormat='The answer is: {0}'}">
    <TextBox.DataContext>
      <sys:Int32>42</sys:Int32>
    </TextBox.DataContext>
    <TextBox.ToolTip>
      <ToolTip Content="{Binding}" ContentStringFormat="{}The answer is: {0}" />
    </TextBox.ToolTip>
  </TextBox>
</StackPanel>

Je préfère beaucoup plus simple syntaxe, quelque chose comme celui dans ma question initiale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X