1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut Changement de couleur pour un mode jour nuit

    Bonsoir,

    Je suis nouveau sur C# et me voila car je suis confronté à un "léger" problème

    j'aimerais créer un mode jour/nuit pour une application WPF. Ainsi j'aimerais pouvoir changer les couleurs depuis le cs plutot que le XAML à une certaine heure mais je ne trouve pas de méthode à utiliser dans un grid genre grid.color.

    Ou alors, je cherche mal :s

    Bien à vous, tillc

  2. #2
    Nouveau membre du Club Avatar de coco1397
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : novembre 2016
    Messages : 35
    Points : 34
    Points
    34

    Par défaut

    Salut à toi,

    Il y a un exemple simple. Avec cela, tu peux déjà changer le background de ta grid:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Grid.Background = couleur;
    Ensuite, tout dépends ce que tu veux modifier. Si tu veux changer la couleur du text des labels ou des boutons. Il y a pleins de choses

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2007
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juin 2007
    Messages : 290
    Points : 423
    Points
    423

    Par défaut

    Tu peux aussi le faire côté XAML en exposant l'heure en cours dans une propriété et utilisant un DataTrigger qui modifiera le background de ta grille (flemme de poster du code là-tout-de-suite, désolé je reviendrai plus tard). Sinon ce dont tu parles évoque une notion de thème (généralement des valeurs stockées dans des dictionnaires XAML).

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2017
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    bonsoir, d'abord merci pour vos réponses

    coco, j'ai déja essayer cette solution le problème étant qu'il ne trouve pas les couleurs : blue, red, etc...

    Noxen, je veux bien le code des que tu l'auras posté parce que je pensais pas que c'était possible de gérer ça depuis le XAML

    Cdl, tillc

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2007
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : juin 2007
    Messages : 290
    Points : 423
    Points
    423

    Par défaut

    Bon, je trouve enfin u peu de temps pour te répondre. J'ai fait un petit projet WPF qui affiche des cercles dont la couleur change avec l'heure. Je l'ai créé à partir d'un modèle de projet application WPF auquel j'ai rajouté les packages Nuget de la bibliothèque MVVMLight de Laurent Bugon, qui rajoute entre autre le MainViewModel et le ViewModelLocator.

    Il y a trois fichiers importants :

    - TimeToColorConverter.cs : c'est un IValueConverter qui prend un DateTime et renvoie un Color en fonction du nombre de seconde ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    namespace ChronoColors.Converters
    {
        public class TimeToColorConverter : IValueConverter
        {
            public static readonly Color[] ColorList = new Color[]
            {
                Colors.Aqua,
                Colors.BlueViolet,
                Colors.BurlyWood,
                Colors.RosyBrown,
                Colors.CadetBlue,
                Colors.Chocolate,
                Colors.Coral,
                Colors.DeepPink,
                Colors.DodgerBlue,
                Colors.ForestGreen
            };
     
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (!(value is DateTime)) return null;
                var time = (DateTime)value;
                int index = time.Second / 6;
                return ColorList[index];
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return null;
            }
        }
    }
    - MainViewModel.cs : le ViewModel principal, qui expose différentes propriétés : le temps en cours, une couleur basée sur le temps en cours + 6 secondes et une chaîne qui contient "Day" entre 8h et 21h et "Night" entre 21h et 8h ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    namespace ChronoColors.ViewModel
    {
        public class MainViewModel : ViewModelBase
        {
            public MainViewModel()
            {
                PropertyChanged += MainViewModel_PropertyChanged;
                _timer.Elapsed += _timer_Elapsed;
                CurrentTime = DateTime.Now;
                _timer.Enabled = true;
            }
     
     
            #region Properties
            private void MainViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
            {
                switch (e.PropertyName)
                {
                    case "CurrentTime":
                        CurrentColor = TimeToColor(CurrentTime);
                        DayTime = CurrentTime.Hour > 8 && CurrentTime.Hour < 21 ? "Day" : "Night";
                        break;
                }
            }
     
            private DateTime _currentTime;
            public DateTime CurrentTime
            {
                get { return _currentTime; }
                set { Set(ref _currentTime, value); }
            }
     
            private Color _color;
            public Color CurrentColor { get { return _color; } set { Set(ref _color, value); } }
     
            private string _dayTime = "Day";
            public string DayTime { get { return _dayTime; } set { Set(ref _dayTime, value); } }
     
            #endregion
     
     
            #region Timer
     
            private readonly Timer _timer = new Timer { Interval = 100.0 };
            private void _timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                CurrentTime = DateTime.Now;
            }
     
            #endregion
     
     
            #region Colors
     
            private static readonly TimeToColorConverter _converter = new TimeToColorConverter();
     
            private static Color TimeToColor(DateTime time)
            {
                return _converter.Convert(time.AddSeconds(6), typeof(Color), null, CultureInfo.CurrentUICulture) as Color? ?? Colors.White;
            }
     
            #endregion
        }
    }
    - MainWindow.xaml : la fenêtre principale, qui utilise un Grid comme conteneur principal et contient différents contrôles dont l'apparence dépend des propriétés du MainViewModel.
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <Window x:Class="ChronoColors.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:conv="clr-namespace:ChronoColors.Converters"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:local="clr-namespace:ChronoColors"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            Title="MainWindow"
            Width="525"
            Height="350"
            DataContext="{Binding Main,
                                  Source={StaticResource Locator}}"
            mc:Ignorable="d">
        <DockPanel>
            <Grid DockPanel.Dock="Top">
                <TextBlock FontSize="24"
                           FontWeight="Bold"
                           Text="Titre"
                           TextAlignment="Center" />
            </Grid>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.Resources>
                    <Style TargetType="Grid">
                        <Style.Setters>
                            <Setter Property="Background" Value="BlanchedAlmond" />
                        </Style.Setters>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding DayTime}" Value="Night">
                                <DataTrigger.Setters>
                                    <Setter Property="Background" Value="LightGray" />
                                </DataTrigger.Setters>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                    <Style TargetType="Border">
                        <Setter Property="BorderThickness" Value="1" />
                        <Setter Property="BorderBrush" Value="Gray" />
                    </Style>
                </Grid.Resources>
                <Border Grid.Row="0" Grid.Column="0">
                    <TextBlock Text="Heure" />
                </Border>
                <Border Grid.Row="0" Grid.Column="1">
                    <TextBlock Text="Couleur dans le ViewModel" />
                </Border>
                <Border Grid.Row="1" Grid.Column="0">
                    <TextBlock Text="{Binding CurrentTime, StringFormat=hh:mm:ss}" />
                </Border>
                <Border Grid.Row="1" Grid.Column="1">
                    <TextBlock Text="{Binding CurrentColor}" />
                </Border>
                <Border Grid.Row="2" Grid.Column="0">
                    <Ellipse Width="100" Height="100">
                        <Ellipse.Resources>
                            <conv:TimeToColorConverter x:Key="ttcc" />
                        </Ellipse.Resources>
                        <Ellipse.Fill>
                            <SolidColorBrush Color="{Binding CurrentTime, Converter={StaticResource ttcc}}" />
                        </Ellipse.Fill>
                    </Ellipse>
                </Border>
                <Border Grid.Row="2" Grid.Column="1">
                    <Ellipse Width="100" Height="100">
                        <Ellipse.Fill>
                            <SolidColorBrush Color="{Binding CurrentColor}" />
                        </Ellipse.Fill>
                    </Ellipse>
                </Border>
            </Grid>
        </DockPanel>
    </Window>

    Le Grid de la fenêtre a un Style personnalisé, qui modifie son Background par un DataTrigger lié à la propriété DayTime du ViewModel. La première Ellipse a sa couleur de remplissage liée au CurrentTime, dont elle obtient une couleur à partir du TimeToColorConverter vu précédemment. Pour la deuxième Ellipse, la couleur de la brosse est directement liée à la propriété CurrentColor.

    J'espère que ma réponse n'est pas trop tardive. S'il y a des chose que tu ne comprends pas dans le code n'hésite pas à demander.

Discussions similaires

  1. Changement de couleur pour tous les elements ?
    Par yassin123441 dans le forum JavaScript
    Réponses: 3
    Dernier message: 13/05/2013, 13h28
  2. Réponses: 3
    Dernier message: 15/03/2007, 22h18
  3. Réponses: 1
    Dernier message: 22/01/2007, 10h32
  4. Couleur pour certains jours dans un calendrier
    Par striker90 dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/05/2006, 21h22
  5. Affichage mode jour & mode nuit
    Par arnaud31 dans le forum Windows
    Réponses: 1
    Dernier message: 26/09/2005, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo