IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Supprimer tout les UIelement en dessous d'un UserControl


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut Supprimer tout les UIelement en dessous d'un UserControl
    Bonjour !

    Je réalise un logiciel de dessin, et pour la gomme j'utilise ceci :
    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
    List<Rectangle> toRemove = new List<Rectangle>();
     
                    for (int x = 0; x < (EraserThickness / 2) - 10; x++)
                    {
                        foreach(UIElement uielement in Canvas_board_draw.Children)
                        {
                            if(uielement is Rectangle)
                            {
                                if((Mouse.GetPosition(Canvas_board_draw).X - Canvas.GetLeft(uielement)) - 10 < x && (Mouse.GetPosition(Canvas_board_draw).X - Canvas.GetLeft(uielement)) - 10 > x - 20
                                    && (Mouse.GetPosition(Canvas_board_draw).Y - Canvas.GetTop(uielement)) - 10 < x && (Mouse.GetPosition(Canvas_board_draw).Y - Canvas.GetTop(uielement)) - 10 > x - 20)
                                {
                                    toRemove.Add(uielement as Rectangle);
                                }
                            }
                        }                     
                    }
     
                    toRemove.ForEach(r =>
                    {
                        Canvas_board_draw.Children.Remove(r);
                    });
    Les Uielement "rectangle" sont les pixels sur le canvas.

    Pour plus de déco, j'ai ajouté un UserControl représentant la gomme (en pièce jointe) :

    Le problème c'est que cette technique ne fonctionne pas bien et est très lente.

    Alors voilà, est-ce que il y a moyen d'avoir la liste de tout les UIElement en dessous de mon UC pour pouvoir les supprimers, ou juste tout simplement un autre moyen

    Merci
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    C'est ton code qui est mauvais ,emberlificoté, la suppression des UIElements sous la gomme ("rubber eraser") se fait en testant l'intersection entre "gomme" et UIElement , et la suppression des éléments se fait en moins de temps qu'il ne faut pour le dire.
    Pour cela on construit le "rectangle geometrique" de la gomme (class Rect ) et celui de l'UIElement intersecté.
    et on utiles l'Api du class Rect
    code behind.cs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                     if (rcItem.IntersectsWith(rcEraser ))
                    {
                        shapeIntersected = item; //  on recupere l'item
                        break;
                    }
                return   shapeIntersected;
    exemple complet de code behind.cs avec un form user :
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    namespace WpfApplication1
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private Random rnd = new Random();
            private List<Shape> shapes = new List<Shape>();
            private Ellipse ellipEraser = new Ellipse();
            public MainWindow()
            {
                InitializeComponent();
                this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
            }
     
            void MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                FillCanvas();// populate  (peuplement du canvas avec quelques rectangles de test)
     
                // ajout  de la gomme au canvas
                UpdateShapes();
            }
            private void FillCanvas()
            {
                for (int i = 1; i < 21; i++)
                {
                    Shape rect =  new Rectangle();
                    SetShape(rect,new Point(),false);
                    shapes.Add(rect);
                    UpdateShapes();
                }
     
            }
            private void SetShape(Shape shp, Point ptClicked, bool IsInteractive)
            {
                if (!IsInteractive)
                {
                    double x, y;
                    shp.Fill = Brushes.Yellow;
                    shp.Stroke = Brushes.Red;
                    shp.Width = 10;
                    shp.Height = 5;
                    x = rnd.Next(5, 350);
                    y = rnd.Next(10, 250);
                    Canvas.SetLeft(shp, x);
                    Canvas.SetTop(shp, y);
                }
                else
                {
                    double x, y;
                    shp.Fill = Brushes.Yellow;
                    shp.Stroke = Brushes.Red;
                    shp.Width = 10;
                    shp.Height = 5;
                    x = ptClicked.X;
                    y = ptClicked.Y;
                    Canvas.SetLeft(shp, x);
                    Canvas.SetTop(shp, y);
                }
     
            }
            private void SetEraserShape(Ellipse shpEllip)
            {
                double x, y;
                shpEllip.Fill = Brushes.Magenta;
                shpEllip.Stroke = Brushes.Black;
                shpEllip.Width = 12;
                shpEllip.Height = 8;
                shpEllip.Visibility = Visibility.Collapsed;
                x = -12;
                y = -8;
                Canvas.SetLeft(shpEllip, x);
                Canvas.SetTop(shpEllip, y);
     
            }
            // handlers mouse
            private void chart_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                Point pointClicked = e.GetPosition(chart);
     
                if (cmdAdd.IsChecked == true)
                {
                    Shape  shape = new Rectangle();
                    SetShape(shape, pointClicked, true);
                    Canvas.SetLeft(shape, pointClicked.X);
                    Canvas.SetTop(shape, pointClicked.Y);
                    shapes.Add(shape);
                    UpdateShapes();
                }
            }
     
     
            private void chart_MouseMove(object sender, MouseEventArgs e)
            {
                Point pointClicked = e.GetPosition(chart);
                Canvas.SetLeft(ellipEraser, pointClicked.X);
                Canvas.SetTop(ellipEraser, pointClicked.Y);
                if (cmdEraser.IsChecked == true)
                {
                    ellipEraser.Visibility = Visibility.Visible;
     
                    //Rectangle currentShape = GetRectangle(pointClicked);
                    Rectangle currentShape = GetRectangle();
                    if (currentShape != null)
                    {
     
                        shapes.Remove(currentShape);
                        UpdateShapes();
     
     
     
                    }
                }
                else if (cmdQuitEraser.IsChecked == true)
                {
                    Canvas.SetLeft(ellipEraser, -12);
                    Canvas.SetTop(ellipEraser, -8);
                    ellipEraser.Visibility = Visibility.Collapsed;
                    UpdateShapes();
                }
            }
            private void chart_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                //if (cmdQuitEraser.IsChecked == true)
                //{
                //    Canvas.SetLeft(ellipEraser, -12);
                //    Canvas.SetTop(ellipEraser, -8);
                //    ellipEraser.Visibility = Visibility.Collapsed;
                //    UpdateShapes();
                //}
            }
     
     
            private void UpdateShapes()
            {
                chart.Children.Clear();
                // ajout  de la gomme au canvas
                ellipEraser = new Ellipse();
                SetEraserShape(ellipEraser);
                chart.Children.Add(ellipEraser); 
                foreach (var item in shapes)
                {
                    chart.Children.Add(item);
                }
            }
            // obtient le rectangle "intersectionnel" avec la gomme 
            private Rectangle GetRectangle()
            {
                Shape shapeIntersected = null;
                Point eraserP1 = new Point(Canvas.GetLeft(ellipEraser), Canvas.GetTop(ellipEraser));
                Point eraserP2 = new Point(eraserP1.X + ellipEraser.Width, eraserP1.Y + ellipEraser.Height);
                Rect rcEraser = new Rect(eraserP1, eraserP2);
                foreach (Shape item in shapes)
                {
     
                    Point itemP1 = new Point(Canvas.GetLeft(item), Canvas.GetTop(item));
                    Point itemP2 = new Point(itemP1.X + item.Width, itemP1.Y + item.Height);
                    Rect rcItem = new Rect(itemP1, itemP2);
                    lblrect.Content = rcItem.ToString();
                    if (rcItem.IntersectsWith(rcEraser ))
                    {
                        shapeIntersected = item;
                        break;
                    }
                }
     
                return (Rectangle)shapeIntersected;
            }
     
        }
    }
    et son code xaml:
    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
    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
     
            <ToolBarTray Orientation="Vertical">
                <ToolBar  Grid.Column="0" Margin="3">
                    <RadioButton Margin="0,5" Name="cmdAdd" HorizontalAlignment="Left">Add Rect</RadioButton>
                    <RadioButton Margin="0,5" Name="cmdEraser" HorizontalAlignment="Left">Eraser</RadioButton>
                    <RadioButton Margin="0,5" Name="cmdQuitEraser" HorizontalAlignment="Left">Quit Eraser</RadioButton>
                    <Label x:Name="lblpoint" Content="xx..."/>
                    <Label x:Name="lblrect" Content="xx..."/>
                </ToolBar>
            </ToolBarTray>
            <Canvas 
                x:Name="chart"  Grid.Column="1" Margin="3"
                Background="Transparent" Width="400" Height="300" 
                MouseLeftButtonDown="chart_MouseLeftButtonDown"
                MouseMove="chart_MouseMove"
                MouseLeftButtonUp="chart_MouseLeftButtonUp"
                >
     
            </Canvas>
        </Grid>
    </Window>
    bon code.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Déjà merci énormèment, je pensais pas qu'on allait jamais me répondre à une demande aussi complexe ^^'

    Ca fonctionne niquel, j'ai jamais été aussi content j'étais prêt à abandonner !

    Voici comment j'ai adapté ton code dans mon cas :

    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
    ErasingLoop = true;
     
    Canvas.SetLeft(EraserCircle, Mouse.GetPosition(Canvas_board_draw).X - (EraserThickness / 2));
    Canvas.SetTop(EraserCircle, Mouse.GetPosition(Canvas_board_draw).Y - (EraserThickness / 2));
     
    while (ErasingLoop)
    {
        Rectangle currentShape = GetRectangle();
        if (currentShape != null)
        {
            Canvas_board_draw.Children.Remove(currentShape);
        }
        else 
            ErasingLoop = false;
    }
    Et j'ai pu avoir ce résultat :



    Voilà, encore merci beaucoup tu m'as beaucoup aidé !!
    Dernière modification par Invité ; 01/02/2021 à 21h25. Motif: Inutile de citer intégralement le message précédent

Discussions similaires

  1. Supprimer toutes les lignes en dessous d'une cellule
    Par liop49 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 22/08/2007, 13h50
  2. Supprimer toutes les lignes et colonnes d'un tableau
    Par pekka77 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/12/2005, 11h26
  3. [MS-DOS] Supprimer tout les sous répertoires contenu dans un
    Par Furius dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 30/11/2005, 12h24
  4. Supprimer toutes les partitions Dos
    Par Houssem dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 25/08/2005, 00h36
  5. Supprimer TOUTES les tables d"une bd
    Par perlgirl dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 14/12/2004, 12h12

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