none
Cancellare riempimento rettangolo RRS feed

  • Domanda

  • Ciao a tutti,

    ho un problema con la cancellazione del riempimento di un rettangolo in WPF.

    Il riempimento lo faccio con questo codice

            void setOffSet(Rectangle rect, TimeSpan timeStart, TimeSpan timeStop)
            {
                double percentualeInizio = timeStart.TotalMinutes.PERCENTUALE_DA_PARTE(minutiGiorno);
                double percentualeFine = timeStop.TotalMinutes.PERCENTUALE_DA_PARTE(minutiGiorno);
                LinearGradientBrush linea = rect.Fill as LinearGradientBrush;
                linea.GradientStops.Add(new GradientStop(Colors.Green, (percentualeInizio / 100)));
                linea.GradientStops.Add(new GradientStop(Colors.Red, (percentualeInizio / 100)));
                linea.GradientStops.Add(new GradientStop(Colors.Red, (percentualeFine / 100)));
                linea.GradientStops.Add(new GradientStop(Colors.Green, (percentualeFine / 100)));
            }

    POtreste spiegarmi come eliminare i riempimeti creati in modo da avere il mio rettangolo vuoto? grazie
    • Spostato Marco MinervaMVP lunedì 25 novembre 2013 14:38 Messaggio spostato perché la domanda riguarda WPF
    mercoledì 20 novembre 2013 00:33

Risposte

  • Allora ti basta eliminare tutti i GradientStops al di fuori del primo (che è quello che da il colore alla barra):

    LinearGradientBrush linea = this.rectangle1.Fill as LinearGradientBrush;
                IEnumerable<GradientStop> gradientList = linea.GradientStops.Skip(1);
                gradientList.ToList().ForEach(gradient =>
                {
                    linea.GradientStops.Remove(gradient);
                });

    in questo modo il colore di base sarà sempre quello che determini tu nello xaml con il primo GradientStop.

    EDIT : 

    per cambiare il colore di base basta cambiare il primo GradientStop ovviamente :

    linea.GradientStops[0].Color = Colors.Red;



    • Modificato U 235Editor mercoledì 20 novembre 2013 16:23
    • Proposto come risposta Emiliano Musso mercoledì 20 novembre 2013 16:46
    • Contrassegnato come risposta 82_marco mercoledì 20 novembre 2013 18:56
    mercoledì 20 novembre 2013 16:05
    Postatore

Tutte le risposte

  • Ciao a tutti,

    ho un problema con la cancellazione del riempimento di un rettangolo in WPF.

    Il riempimento lo faccio con questo codice

            void setOffSet(Rectangle rect, TimeSpan timeStart, TimeSpan timeStop)
            {
                double percentualeInizio = timeStart.TotalMinutes.PERCENTUALE_DA_PARTE(minutiGiorno);
                double percentualeFine = timeStop.TotalMinutes.PERCENTUALE_DA_PARTE(minutiGiorno);
                LinearGradientBrush linea = rect.Fill as LinearGradientBrush;
                linea.GradientStops.Add(new GradientStop(Colors.Green, (percentualeInizio / 100)));
                linea.GradientStops.Add(new GradientStop(Colors.Red, (percentualeInizio / 100)));
                linea.GradientStops.Add(new GradientStop(Colors.Red, (percentualeFine / 100)));
                linea.GradientStops.Add(new GradientStop(Colors.Green, (percentualeFine / 100)));
            }

    POtreste spiegarmi come eliminare i riempimeti creati in modo da avere il mio rettangolo vuoto? grazie

    Potresti sostituire il rettangolo con un nuovo rettangolo oppure assegni a rect.Fill il brush del colore che vuoi.

    mercoledì 20 novembre 2013 01:29
  • Ciao, avevo provato a d assegnare il brush del colore iniziale, ma non funziona.

    Per sostituire il rettangolo intendi cancellarlo e ridisegnarlo in Runtime? non ho molta pratica :-(

    mercoledì 20 novembre 2013 08:47
  • 1)

    Ciao, avevo provato a d assegnare il brush del colore iniziale, ma non funziona.

    2)

    Per sostituire il rettangolo intendi cancellarlo e ridisegnarlo in Runtime? non ho molta pratica :-(

    1)

    Esempio: questi due bottoni cambiano il colore al rettangolo.

            private void btn2_Click(object sender, RoutedEventArgs e)
            {
                rect.Fill = new SolidColorBrush(Colors.Orange);
            }
    
            private void btn3_Click(object sender, RoutedEventArgs e)
            {
                rect.Fill = new SolidColorBrush(Colors.Transparent);
            }



    • Modificato BlueLed mercoledì 20 novembre 2013 09:28
    mercoledì 20 novembre 2013 09:27
  • Ciao 82_marco,

    quel codice mi sembra di conoscerlo :D

    Mi permetto di rispondere perché ho suggerito io a 82_marco in un altro post un codice per un controllo wpf, e uno spezzone di questo codice è identico a quello postato. Il post in questione è questo

    @ 82_marco

    in futuro ti conviene postare più codice e spiegare bene l'insieme di cose che stai facendo, perché BlueLed ha risposto correttamente alla domanda per come l'hai posta, però non va bene nel tuo caso...

    devi usare il metodo GradientFromTime per recuperare i gradientStops che sono coinvolti in un orario, quindi eliminarli dal colore del rettangolo.

    puoi ad esempio aggiungere il metodo per rimuoverli :

    bool RemoveOffSet(Rectangle rect, TimeSpan time)
            {
                bool result = false;
                IEnumerable<GradientStop> gradientList = GradientFromTime(rect, time);
                if (gradientList!=null&&gradientList.Any())
                {
                    LinearGradientBrush linea = rect.Fill as LinearGradientBrush;
                    gradientList.ToList().ForEach(gradient => 
                    { 
                        linea.GradientStops.Remove(gradient); 
                    });
                    result = true;
                }
                return result;
            }

    in questo codice non faccio altro che recuperare eventuali gradienti che sono coinvolti in un detto tempo, recuperare il LinearGradientBrush dal .Fill del rettangolo, ed eliminare i gradienti trovati dal colore.

    puoi usarlo in questo modo :

    RemoveOffSet(this.rectangle1, new TimeSpan(12, 0, 1));

    mercoledì 20 novembre 2013 15:28
    Postatore
  • Ciao U 325,

    E' proprio quello che m avevi suggerito .-) , nell evoluzione del mio codice mi e' venuta la necessita' di cancellare il riempimento per cambiare gli orari in cui applicarlo (avendo predisposto degli orari di riempimento per i giorni feriali, festivi e pre-festivi)

    Quando rilevo il cambio ti tipo di giorno vorrei cambiare il riempimento e per fare questo devo prima cancellarlo e poi riscriverlo

    appena esco da lavoro lo provo e vi aggiorno

    mercoledì 20 novembre 2013 15:42
  • Allora ti basta eliminare tutti i GradientStops al di fuori del primo (che è quello che da il colore alla barra):

    LinearGradientBrush linea = this.rectangle1.Fill as LinearGradientBrush;
                IEnumerable<GradientStop> gradientList = linea.GradientStops.Skip(1);
                gradientList.ToList().ForEach(gradient =>
                {
                    linea.GradientStops.Remove(gradient);
                });

    in questo modo il colore di base sarà sempre quello che determini tu nello xaml con il primo GradientStop.

    EDIT : 

    per cambiare il colore di base basta cambiare il primo GradientStop ovviamente :

    linea.GradientStops[0].Color = Colors.Red;



    • Modificato U 235Editor mercoledì 20 novembre 2013 16:23
    • Proposto come risposta Emiliano Musso mercoledì 20 novembre 2013 16:46
    • Contrassegnato come risposta 82_marco mercoledì 20 novembre 2013 18:56
    mercoledì 20 novembre 2013 16:05
    Postatore
  • Perfetto :-)

    VI ringrazio dell' aiuto che mi state dando

    mercoledì 20 novembre 2013 18:56