2010-11-23 5 views
2

ce que je veux faire est de donner à l'utilisateur la possibilité de changer certaines (ici une) propriété de toutes les zones de texte dans mon application. Lorsque l'utilisateur déclenche mon événement, chaque zone de texte de chaque commande utilisateur, panneau, etc. doit être modifiée. Par exemple, toutes les zones de texte doivent être remplacées par Multiline=true; (je sais que cela n'a pas beaucoup de sens, mais mes besoins sont très similaires), mais comment y parvenir sans boucler tous les contrôles?Comment changer la propriété de chaque contrôle dans l'application

Je sais que je pouvais faire quelque chose comme

foreach(Control item in FindForm().Controls) 
{ 
    if(item is TextBox) 
    { 
     (item as TextBox).Multiline=true; 
    } 
} 

mais je ne pense pas que ce soit une parfaite ni une bonne solution.

Je sais que je pourrais écrire les paramètres dans un fichier et les lire quand l'application démarre, mais comment changer les propriétés lors de l'exécution de l'application? Mon problème principal est que les propriétés de contrôle ne me permettent pas de leur donner une référence à un objet booléen, donc je ne peux pas facilement le changer dans un "settings-object", ou est-ce que quelque chose me manque?

Répondre

2

Je ne connais pas de bons tutoriels pour vous guider à travers, mais vous pouvez faire une DataBinding à n'importe quelle propriété (y compris Multiline) et pas seulement le texte. Cela devrait faire ce que vous devez faire. J'ai utilisé le fichier config dans cet exemple, mais il peut être stocké n'importe où.

+0

Je vais donner ce essayer aujourd'hui, je suis curios si cela fonctionne pour moi :) – basti

+0

C'est faire ce que je veux, pas aussi facile et simple à écrire que je pensais, mais il fait ce qu'il devrait - merci! – basti

0

Dans ces circonstances, vous avez deux options de base: pousser les changements dans le contrôle (comme vous l'exemple de code DOE) ou ont les contrôles eux-mêmes tirer les données de la configuration. L'utilisation d'une approche d'extraction vous permettra de mettre à jour les contrôles au moment de l'exécution. Vous pouvez utiliser la liaison de données sur toutes vos zones de texte pour lier la propriété 'Multiligne' des zones de texte à un magasin central du paramètre. Vous pouvez aller plus loin et dériver des contrôles de zone de texte personnalisés qui gèrent automatiquement leur propre installation de datation sur instanciation, donc une fois que vous avez remplacé les zones de texte avec votre propre type de zone de texte (ceci peut être fait avec le code) avoir à faire plus de changements de code.

0

Peut-être que vous pouvez simplement utiliser un déclencheur de données et une classe utilitaire globalement accessible:

Voici un exemple où le clic d'un bouton de tous textblock aura un avant-plan rouge

<Window x:Class="RoomUnit.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:c="clr-namespace:RoomUnit" Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <c:Utility x:Key="utility" /> 
    <Style TargetType="TextBlock"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Source={StaticResource utility}, 
        Path=IsRed}" Value="true"> 
       <Setter Property="Foreground" Value="Red" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <TextBlock Text="TEST" /> 
    <Button Content="Make Red" Grid.Row="1" Click="MakeRed" /> 
</Grid> 

heres la classe d'utilité

public class Utility : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private bool isRed; 
    public bool IsRed 
    { 
     get { return isRed; } 
     set 
     { 
      isRed = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("IsRed")); 
     } 
    } 
} 

et heres my b utton eventhandler

private void MakeRed(object sender, RoutedEventArgs e) 
{ 
    var u = (Utility) this.FindResource("utility"); 
    u.IsRed = true; 
} 
+0

Dans ses balises il a dit que c'est winforms pas WPF –

+0

Merci pour cet exemple détaillé, mais comme Scott l'a dit, je suis à la recherche d'une solution dans WinForms. – basti

Questions connexes