2010-07-03 2 views

Répondre

1

Voici une façon de le faire, au fond ce que je l'ai fait est:

  1. ComboBox Sous-classe et ajouter IsProgressVisible et les propriétés de dépendance ProgressValue
  2. Ajouter un vert rectangle le modèle de contrôle ComboBox situé exactement derrière la zone modifiable
  3. Lier la visibilité du rectangle à IsProgressVisible et la largeur du rectangle (à l'aide d'une ScaleTransform) à ProgressValue

D'abord le nouveau code de commande:

public class ProgressCombo : ComboBox 
{ 
    public static readonly DependencyProperty IsProgressVisibleProperty = 
     DependencyProperty.Register("IsProgressVisible", typeof(bool), typeof(ProgressCombo)); 
    public bool IsProgressVisible 
    { 
     get { return (bool)GetValue(IsProgressVisibleProperty); } 
     set { SetValue(IsProgressVisibleProperty, value); } 
    } 
    public static readonly DependencyProperty ProgressValueProperty = 
     DependencyProperty.Register("ProgressValue", typeof(double), typeof(ProgressCombo)); 
    public double ProgressValue 
    { 
     get { return (double)GetValue(ProgressValueProperty); } 
     set { SetValue(ProgressValueProperty, value); } 
    }   
} 

Il y a aussi un convertisseur de valeur, nous utiliserons:

public class FromPercentConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return ((double)value)/100; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Maintenant, prenez la zone de liste déroulante de style exemple de MSDN (.net version 3.5, pas 4) http://msdn.microsoft.com/en-us/library/ms750638%28VS.90%29.aspx

Ajouter une définition xmlns:l à votre propre assemblée

Maintenant, changez <Style x:Key="{x:Type ComboBox}" TargetType="ComboBox">-<Style x:Key="{x:Type l:ProgressCombo}" TargetType="l:ProgressCombo">

Changement <ControlTemplate TargetType="l:ComboBox"> Pour:

<ControlTemplate TargetType="l:ProgressCombo"> 
    <ControlTemplate.Resources> 
     <BooleanToVisibilityConverter x:Key="Bool2Vis"/> 
     <l:FromPercentConverter x:Key="FromPercent"/> 
    </ControlTemplate.Resources> 

Localisez la ligne <ContentPresenter et ajoutez juste avant:

<Rectangle 
    Fill="LightGreen" 
    Margin="3,3,23,3" 
    Visibility="{TemplateBinding IsProgressVisible, Converter={StaticResource Bool2Vis}}"> 
    <Rectangle.RenderTransform> 
     <ScaleTransform ScaleX="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ProgressValue, Converter={StaticResource FromPercent}}"/> 
    </Rectangle.RenderTransform> 
</Rectangle> 

Et voilà

+0

J'ai besoin de ce code dans VB.NET 3.5. Quand j'ai converti le code en utilisant le convertisseur de code en ligne de teleriks et que je l'ai collé dans Visual Studio, j'ai eu toutes sortes d'erreurs. – muckdog12

+0

@ muckdog12 - ne peut pas vous aider avec la syntaxe VB mais le code est extreamly simple, la classe ProgressCombo hérite de ComboBox et ajoute deux propriétés de dépendance en utilisant le code le plus simple IsProgressVisible de type Boolean et ProgressValue de type Double. la classe FromPresentConverter implémente l'interface IValueConverter et dans la méthode Converts retrns value/100 - vous devriez pouvoir recréer ces deux classes en utilisant des exemples VB pour les propriétés de dépendance et les convertisseurs de valeurs. – Nir

Questions connexes