DOMANDA C# passare form a una classe

OttoOtti

Nuovo Utente
Salve ragazzi vorrei passare a una classe un form ma non so come fare ? ho provato cosi ma non funziona ? samete quale il metodo giusto per cambiare elementi di un form tramite una classe ?
Classe : graphics
C#:
public void trasparenza <TWindow>() where TWindow : MainWindow, new()
        {
            var form = new TWindow();

            form.menu.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(216, 0, 0, 0));
            form.barra_cav.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(216, 0, 0, 0));
            //barra_1 = new SolidColorBrush(System.Windows.Media.Color.FromArgb(216, 0, 0, 0));
        }
Form:MainWindow
C#:
graphics Gra_Main = new graphics();

public MainWindow()
        {
            InitializeComponent();
            Gra_Main.trasparenza<MainWindow>();
        }
 

_Achille

Utente Èlite
3,004
691
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
I Generics non centrano nulla.

Devi semplicemente passare il form alla funzione che fa modifiche
 
  • Mi piace
Reactions: Andretti60

Andretti60

Utente Èlite
3,550
2,375
Hardware Utente
La passi esattamente come qualsiasi altro parametro, definiscilo come Form e sei a posto.

Ma perche' devi creare una classe per cambiare i parametri della tua Form?
 

Andretti60

Utente Èlite
3,550
2,375
Hardware Utente
Se il menu e' nel stesso Form, perche' hai bisogno di una classe?

Non sto criticando, solo cercare di capire.
In genere le classi sono entita' "autonome" che non dovrebbero mai toccare proprieta' dei componenti GUI usate nella stessa applicazione. Una classe serve per mantenere lo "stato" di una applicazione, e il Form cambia il suo aspetto a seconda del valore delle proprieta' di tale classe.
Credimi, modificare il GUI all'interno di una classe e' una ricetta per scrivere "spaghetti code".
 
  • Mi piace
Reactions: Mursey

_Achille

Utente Èlite
3,004
691
Hardware Utente
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
Hard Disk
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
Scheda Video
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
Alimentatore
RM550X
Case
NZXT S340
Periferiche
Cooler Master XT; Razer Abyssus
Sistema Operativo
Windows 10 Pro
XD la sto utilizzando per creare la grafica del vari form per non ripete lo stesso codice utilizzo la classe è sbagliato ?
Per non ripetere codice si utilizzano funzioni, in questo caso (C#) chiamate metodi di una classe.

Siccome devi apportare modifiche nel Form stesso, perché non utilizzi un metodo interno che modifica i suoi attributi?
 

Andretti60

Utente Èlite
3,550
2,375
Hardware Utente
XD la sto utilizzando per creare la grafica del vari form per non ripete lo stesso codice utilizzo la classe è sbagliato ?
Non e' sbagliato, ma quello e' un discorso diverso da quello che hai richiesto (gestire un menu). Ma il problema rimane, ossia che la classe (comune) debba conoscere le proprieta' interne delle varie Form che hai nel tuo progetto.
A questo punto e' difficile continuare la discussione senza avere piu' informazione di quello che vuoi ottenere, in quanto esistono molti modi per fare cio', dipende dalla situazione.

Comunque, per rispondere alla tua domanda, puoi passare la tua Form esattamente come una Form, vedi questo stupido esempio (il codice non e' provato, e' solo per dare una idea):

C#:
public class Graphics
{
    public Graphics()
    {
    }
    
    public void Change(Form f)
    {
        // do something with f
    }
}

public partial class FormMain : Form
{
    private Graphics g = new Graphics();
    
    private void ActionAndGo()
    {
        g.Change(this);
    }
}
Quello e' il modo piu' semplice e generico. La classe Graphics non sa nulla dei parametri interni della Form, quindi puo' accedere solo alle proprieta' generiche della Form. Puoi anche dichiarare la classe Graphics come static cosi' non hai bisogno di crearla (visto che modifica solo i parametri della From che passi). Potresti ottenere lo stesso usando un "extension method" il che ti eviterebbe di creare una classe apposta. Insomma, come vedi le soluzioni sono molteplici, come in quasi tutti i casi.
Devi prima di tutto definire le tue specifiche del progetto, e partire da quelle. Solo sapendo cosa vuoi ottenere potrai trovare la giusta soluzione.
 

OttoOtti

Nuovo Utente
allora praticante sto riscrivendo il codice in modo pulito di un programma che ho già fatto , pero ogni pagina era troppo lunga quindi voglio dividere il codice in blocchi e classi , la domanda e questa come posso ordinare in modo pulito il codice ? vorrei utilizzare le classi per gestire tutte le animazioni e grafica del programma
Post automaticamente unito:

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.Windows.Media.Imaging;
using System.IO;

namespace Test
{
    class menu
    {
        // DATE
        public System.Windows.Point window = new System.Windows.Point(SystemParameters.VirtualScreenWidth, SystemParameters.VirtualScreenHeight);
        public SolidColorBrush system_color = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 0, 0));

        public void border_load(MainWindow form)
        {
            //border_draws(form, system_color, 4);
            menu_main(form, 1);

        }

        public void border_draws(MainWindow form, SolidColorBrush colore, int selected)
        {
            int origHeight = Convert.ToInt32(window.Y);
            int x = origHeight / 5;
            int a1 = x - 95;
            int sel = selected * x - 95;
            int inizio = sel, medio = x, fine = origHeight;

            int max = 80, min = 60 ,a= inizio, b=medio,c= origHeight;

            Polyline Poly = form.menu_poly;
            Poly.Stroke = colore;
            Poly.StrokeThickness = 1.4;
            Poly.FillRule = FillRule.EvenOdd;
            System.Windows.Point Point1 = new System.Windows.Point(max, 0);
            System.Windows.Point Point2 = new System.Windows.Point(max, a);
            System.Windows.Point Point3 = new System.Windows.Point(min, a + 25);
            System.Windows.Point Point4 = new System.Windows.Point(min, a + b + 25);
            System.Windows.Point Point5 = new System.Windows.Point(max, a + b + 50);
            System.Windows.Point Point6 = new System.Windows.Point(max, c);
            PointCollection myPointCollection2 = new PointCollection();
            myPointCollection2.Add(Point1);
            myPointCollection2.Add(Point2);
            myPointCollection2.Add(Point3);
            myPointCollection2.Add(Point4);
            myPointCollection2.Add(Point5);
            myPointCollection2.Add(Point6);
            Poly.Points = myPointCollection2;
            form.menu_poly = Poly;

            form.body_border.BorderBrush = colore;
        }

        public void menu_main(MainWindow form, int selected)
        {
            menu_button_color(form, system_color,"/graphics/demo.png");
            menu_button_template(form);
            menu_button_selected(form, selected);
            border_draws(form, system_color, selected);
        }

        public void menu_button(MainWindow form)
        {

        }

        public void menu_button_template(MainWindow form)
        {
            int height = Screen.PrimaryScreen.Bounds.Height;
            int x = height / 5 - 10;

            // BUTTONE 1
            form.button_1.Margin = new Thickness(0, x, 0, 0);
            form.button_2.Margin = new Thickness(0, x + x, 0, 0);
            form.button_3.Margin = new Thickness(0, x + x + x, 0, 0);
            form.button_4.Margin = new Thickness(0, x + x + x + x, 0, 0);
        }

        public void menu_button_selected(MainWindow form, int selected)
        {
            if (selected == 1)
            {
                form.button_1.Width = 60;
                form.button_2.Width = 80;
                form.button_3.Width = 80;
                form.button_4.Width = 80;
            }

            if (selected == 2)
            {
                form.button_1.Width = 80;
                form.button_2.Width = 60;
                form.button_3.Width = 80;
                form.button_4.Width = 80;
            }

            if (selected == 3)
            {
                form.button_1.Width = 80;
                form.button_2.Width = 80;
                form.button_3.Width = 60;
                form.button_4.Width = 80;
            }

            if (selected == 4)
            {
                form.button_1.Width = 80;
                form.button_2.Width = 80;
                form.button_3.Width = 80;
                form.button_4.Width = 60;
            }

        }

        public void menu_button_color(MainWindow form, SolidColorBrush colore, String image)
        {

            System.Windows.Media.SolidColorBrush color = colore;
            System.Drawing.Color myColor = System.Drawing.Color.FromArgb(color.Color.A,
                                                             color.Color.R,
                                                             color.Color.G,
                                                             color.Color.B);

            Bitmap bmp_original = new Bitmap("C:/Users/Salvatore/Downloads/test.png");

            bmp_original.MakeTransparent();
            bmp_original.MakeTransparent(System.Drawing.Color.Transparent);
            Bitmap bmp_new = new Bitmap(bmp_original);
            bmp_new.MakeTransparent();
            bmp_new.MakeTransparent(System.Drawing.Color.Transparent);

            int height = bmp_original.Height, width = bmp_original.Width;

            for (int y = 0; y< height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    // prende il pixel
                    System.Drawing.Color p = bmp_original.GetPixel(x, y);

                    // estrae il colore ARGB
                    int a = p.A;
                    int r = p.R;
                    int g = p.G;
                    int b = p.B;

                    // setta il colore del pixel
                    if (a != 0)
                        bmp_new.SetPixel(x, y, myColor);
                }

            }

            form.button_1_img.Source = BitmapToImageSource(bmp_new);
            form.button_2_img.Source = BitmapToImageSource(bmp_new);
            form.button_3_img.Source = BitmapToImageSource(bmp_new);
            form.button_4_img.Source = BitmapToImageSource(bmp_new);

        }

        // ALTRI

        BitmapImage BitmapToImageSource(Bitmap bitmap)
        {
            using (MemoryStream memory = new MemoryStream())
            {
                bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
                memory.Position = 0;
                BitmapImage bitmapimage = new BitmapImage();
                bitmapimage.BeginInit();
                bitmapimage.StreamSource = memory;
                bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapimage.EndInit();

                return bitmapimage;
            }
        }

        // END CLASS
    }
}
 
Ultima modifica:

Andretti60

Utente Èlite
3,550
2,375
Hardware Utente
Le classi NON vanno usate per spezzettare il codice. Se il file di quella classe diventa troppo lungo, la cosa da fare e' spezzare il codice in piu' file e dichiarare la classe in tutti i file con il parametro partial.
Quello che stai creando e', come ti avevo avvertito, "spaghetti code", ossia un garbuglio di classi che conoscono troppo i parametri interni delle altre classi (per esempio la tua classe conosce tutti i controlli contenuti nella tua MainWindow, tipo menu e bottoni)
 

OttoOtti

Nuovo Utente
capito , come posso fare per spezzettare il codice mi fai un esempio in codice cosi aggiusto il mio errore :D
Post automaticamente unito:

credo di avere risolto aspetto conferma del fatto che sia il metodo giusto Andre , ho creato un file di nome "graphics.cs" e dentro ho scritto questo codice
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Threading;
using System.Reflection;
using System.IO;

namespace Test
{
    /// <summary>
    /// Logica di interazione per MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        // DATE
        public System.Windows.Point window = new System.Windows.Point(SystemParameters.VirtualScreenWidth, SystemParameters.VirtualScreenHeight);
        public SolidColorBrush system_color = new SolidColorBrush(System.Windows.Media.Color.FromArgb(255, 255, 0, 0));

        // -----------------------------------------------
        // MAIN
        // -----------------------------------------------

        public void MainWindow_load()
        {
            menu_main(1);

        }

        public void border_draws(SolidColorBrush colore, int selected)
        {
            int origHeight = Convert.ToInt32(window.Y);
            int x = origHeight / 5;
            int a1 = x - 95;
            int sel = selected * x - 95;
            int inizio = sel, medio = x, fine = origHeight;

            int max = 80, min = 60, a = inizio, b = medio, c = origHeight;

            Polyline Poly = menu_poly;
            Poly.Stroke = colore;
            Poly.StrokeThickness = 1.4;
            Poly.FillRule = FillRule.EvenOdd;
            System.Windows.Point Point1 = new System.Windows.Point(max, 0);
            System.Windows.Point Point2 = new System.Windows.Point(max, a);
            System.Windows.Point Point3 = new System.Windows.Point(min, a + 25);
            System.Windows.Point Point4 = new System.Windows.Point(min, a + b + 25);
            System.Windows.Point Point5 = new System.Windows.Point(max, a + b + 50);
            System.Windows.Point Point6 = new System.Windows.Point(max, c);
            PointCollection myPointCollection2 = new PointCollection();
            myPointCollection2.Add(Point1);
            myPointCollection2.Add(Point2);
            myPointCollection2.Add(Point3);
            myPointCollection2.Add(Point4);
            myPointCollection2.Add(Point5);
            myPointCollection2.Add(Point6);
            Poly.Points = myPointCollection2;
            menu_poly = Poly;

            body_border.BorderBrush = colore;
        }

        // -----------------------------------------------
        // MENU
        // -----------------------------------------------

        public void menu_main(int selected)
        {
            menu_button(selected);
            border_draws(system_color, selected);
        }

        public void menu_button(int selected)
        {
            menu_button_color(system_color, "/graphics/demo.png");
            menu_button_template();
            menu_button_selected(selected);
        }

        public void menu_button_template()
        {
            int height = Convert.ToInt32(window.Y);
            int x = height / 5 - 10;

            // BUTTONE 1
            button_1.Margin = new Thickness(0, x, 0, 0);
            button_2.Margin = new Thickness(0, x + x, 0, 0);
            button_3.Margin = new Thickness(0, x + x + x, 0, 0);
            button_4.Margin = new Thickness(0, x + x + x + x, 0, 0);
        }

        public void menu_button_selected(int selected)
        {
            if (selected == 1)
            {
                button_1.Width = 60;
                button_2.Width = 80;
                button_3.Width = 80;
                button_4.Width = 80;
            }

            if (selected == 2)
            {
                button_1.Width = 80;
                button_2.Width = 60;
                button_3.Width = 80;
                button_4.Width = 80;
            }

            if (selected == 3)
            {
                button_1.Width = 80;
                button_2.Width = 80;
                button_3.Width = 60;
                button_4.Width = 80;
            }

            if (selected == 4)
            {
                button_1.Width = 80;
                button_2.Width = 80;
                button_3.Width = 80;
                button_4.Width = 60;
            }

        }

        public void menu_button_color(SolidColorBrush colore, String image)
        {

            System.Windows.Media.SolidColorBrush color = colore;
            System.Drawing.Color myColor = System.Drawing.Color.FromArgb(color.Color.A,
                                                             color.Color.R,
                                                             color.Color.G,
                                                             color.Color.B);

            Bitmap bmp_original = new Bitmap("C:/Users/Salvatore/Downloads/test.png");

            bmp_original.MakeTransparent();
            bmp_original.MakeTransparent(System.Drawing.Color.Transparent);
            Bitmap bmp_new = new Bitmap(bmp_original);
            bmp_new.MakeTransparent();
            bmp_new.MakeTransparent(System.Drawing.Color.Transparent);

            int height = bmp_original.Height, width = bmp_original.Width;

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    // prende il pixel
                    System.Drawing.Color p = bmp_original.GetPixel(x, y);

                    // estrae il colore ARGB
                    int a = p.A;
                    int r = p.R;
                    int g = p.G;
                    int b = p.B;

                    // setta il colore del pixel
                    if (a != 0)
                        bmp_new.SetPixel(x, y, myColor);
                }

            }

            button_1_img.Source = BitmapToImageSource(bmp_new);
            button_2_img.Source = BitmapToImageSource(bmp_new);
            button_3_img.Source = BitmapToImageSource(bmp_new);
            button_4_img.Source = BitmapToImageSource(bmp_new);

        }

        // -----------------------------------------------
        // PAGE
        // -----------------------------------------------

        // -----------------------------------------------
        // BARRA
        // -----------------------------------------------

        // -----------------------------------------------
        // ALTRI
        // -----------------------------------------------

        BitmapImage BitmapToImageSource(Bitmap bitmap)
        {
            using (MemoryStream memory = new MemoryStream())
            {
                bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
                memory.Position = 0;
                BitmapImage bitmapimage = new BitmapImage();
                bitmapimage.BeginInit();
                bitmapimage.StreamSource = memory;
                bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapimage.EndInit();

                return bitmapimage;
            }
        }

        // -----------------------------------------------
        // END CLASS
        // -----------------------------------------------
    }
}
 
Ultima modifica:

Entra

oppure Accedi utilizzando