2013-08-20 4 views
0

Essayer de définir le texte dans progressBar et je reçois correctement avec Setters. mais je dois concatuer cette valeur avec:Concat contenu de ContentPresenter

{TemplateBinding Value}+"% Completed 

Comment je concat avec un autre texte.

code où le texte imprimé à l'intérieur progressbar:

<Border x:Name="whiteBorder" > 
     <ContentPresenter x:Name="perHolder" Content="{TemplateBinding Value}" VerticalAlignment="Center" HorizontalAlignment="Right"/> 
</Border> 

Silverlight version 3.0

Répondre

0

Pour augmenter les valeurs, utilisez une classe qui implémente un IValueConverter, qui est décrit ici:

http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

En substance, une classe qui implémente IValueConverter va intercaler le value dans une méthode appelée Convert. La valeur que vous renvoyez de cette méthode est la valeur que vous voulez vraiment afficher. Considérez:

espace de noms

de Sharp {

public class MyConverter : IValueConverter { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
      // First cast the value to an 'int'. 
      Int32 theInputtedValue = (Int32)value; 

      // Then return the newly formatted string. 
      return String.Format("{0}% Completed", theInputtedValue); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
      throw new NotImplementedException(); 
     } 
    } 

}

Avis dans l'exemple ci-dessus le convertisseur de valeur est dans l'espace de noms Sharp. Maintenant, nous ajoutons ceci à la définition XAML:

<Window x:Class="Sharp.MyWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

     xmlns:lol="clr-namespace:Sharp"> 

La dernière ligne est l'espace de noms où notre convertisseur de valeur existe (c'est lol va maintenant pointer vers le Sharp CLR-espace de noms

Ensuite, nous ajoutons le. classe à nos Window ressources.

<Window.Resources> 
    <lol:MyConverter x:Key="TheValueConverter" /> 
</Window.Resources> 

cela crée une instance de la classe que vous pouvez utiliser dans le XAML Ainsi, jusqu'à présent notre XAML ressemble à ceci:

<Window x:Class="Sharp.MyWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

     xmlns:lol="clr-namespace:Sharp"> 

    <Window.Resources> 
     <lol:MyConverter x:Key="TheValueConverter" /> 
    </Window.Resources> 

Maintenant, nous ajoutons simplement à votre présentateur de contenu comme ceci:

<ContentPresenter Content="{TemplateBinding Value, Converter={StaticResource TheValueConverter}}" ... /> 

Cela indique au ContentPresenter que quand il va présenter la valeur, il doit utiliser l'instance TheValueConverter, qui est une instance de notre ValueConverter. Deux choses à faire attention: (1) Assurez-vous que vous utilisez le nom de l'instance (TheValueConverter) et non la classe définition (MyConverter). (2) Assurez-vous d'entourer le nom de l'instance au {StaticResource}.

+0

S'il vous plaît vérifier ce lien ci-joint que j'ai téléchargé échantillon .. dropbox.com/s/2nro23mm0oecknk/Progress%20Bar.zip S'il vous plaît mettre à jour – Rocky111

1

Ou ... Vous pouvez aussi utiliser StringFormat

<ContentPresenter x:Name="perHolder" 
     Content="{TemplateBinding Value, StringFormat='\{\0}&#37; Completed'}" 
     VerticalAlignment="Center" HorizontalAlignment="Right"/> 

Hope this helps ...

+0

Cela ressemble beaucoup J'ai donné un essai, mais n'a pas travaillé .. S'il vous plaît vérifier ce lien ci-joint j'ai fait l'échantillon .. https://www.dropbox.com/s/2nro23mm0oecknk/Progress%20Bar.zip S'il vous plaît mettre à jour. – Rocky111

+0

silverlight version 3.0 – Rocky111

+0

Ah merde Je n'ai pas vu la partie version3. Ce qui ne semble pas prendre en charge StringFormat, ce qui fait que @sircodesalot répond correctement. –

2

Une autre option consiste à utiliser inline elements, comme pistes:

<TextBlock> 
    <Run Text="{TemplateBinding Value}"/> 
    <Run Text="% Completed "/> 
</TextBlock> 

EDIT:

Après avoir regardé votre exemple, je pense que vous ne devriez pas utiliser le présentateur contenu de votre modèle. Le présentateur de contenu est destiné aux contrôles pouvant héberger du contenu (Read: possède une propriété content). Lorsque le présentateur de contenu reçoit une chaîne en tant que contenu, il affiche certainement la chaîne, et vous pouvez l'utiliser, mais pour les chaînes, votre meilleur pari est textblock. Cela donne également à oyu plus de contrôle sur la façon dont la chaîne est affichée.

Aussi, mon mauvais. TemplateBinding est pointilleux sur l'endroit où il est disponible, et les éléments en ligne sont en dehors de sa liste. Votre meilleur pari est comme dit W. Cris, en utilisant StackPanel:

<Border x:Name="whiteBorder" > 
    <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right"> 
     <TextBlock Text="{TemplateBinding Value}"/> 
     <TextBlock Text="% Completed"/> 
    </StackPanel>/> 
</Border> 
+0

Je venais juste d'ajouter ceci à ma réponse après y avoir réfléchi un peu plus tard, haha ​​m'a battu par 50mins, +1 –

+0

Salut j'ai eu% achevé mais pas valeur TemplateBinding avec ceci .. si j'utilise contentpresenter je peux obtenir. Pouvez-vous s'il vous plaît vérifier ce qui doit être changé ou dire comment je peux vous assurer que cela fonctionne dans ce lien .. https://www.dropbox.com/s/2nro23mm0oecknk/Progress%20Bar.zip – Rocky111

+2

Si vous êtes prêt sur l'utilisation de ContentPresenter juste combiner les objets séparément comme

Questions connexes