Даже не знаю, как начать решать эту проблему - PullRequest
3 голосов
/ 21 ноября 2010

Вот макет, который клиент попросил меня создать: alt text

Вот что у меня есть в реальном программном обеспечении:

alt text

Проблема в том,что мне нужно иметь возможность удалить картинку из элемента управления ниже.Я не знаю, как подойти к этой проблеме.Любое руководство?

Вот код для пользовательского пользовательского элемента управления, который я сделал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WebServiceScanner
{
    public partial class selectablePicture : UserControl
    {
        public selectablePicture(Image image)
        {
            InitializeComponent();
            ptbImage.BackgroundImage = image;
            ptbImage.BackgroundImageLayout = ImageLayout.Zoom;
        }

        public Image GetImage()
        {
            return ptbImage.BackgroundImage;
        }

        public bool IsSelected()
        {
            return chkSelected.Checked;
        }

        public void DisableCheckbox()
        {
            this.chkSelected.Enabled = false;
        }

        private void ptbImage_Click(object sender, EventArgs e)
        {
            SelectControl();
            ptbImage.Focus();
            ToggleCheckBox();            
        }

        private void selectablePicture_Click(object sender, EventArgs e)
        {
            SelectControl();
            this.Focus();
            ToggleCheckBox();            
        }

        private void ToggleCheckBox()
        {
            if (!chkSelected.Enabled == false)
            {
                if (chkSelected.Checked)
                {
                    chkSelected.Checked = false;
                }
                else
                {
                    chkSelected.Checked = true;
                }
            }            
        }

        private void chkSelected_Click(object sender, EventArgs e)
        {
            SelectControl();
            chkSelected.Focus();
        }

        private void SelectControl()
        {
            if (!chkSelected.Enabled == false)
            {
                this.BackColor = Color.FromArgb(89, 168, 248);
            }            
        }

        private void chkSelected_Leave(object sender, EventArgs e)
        {
            DeSelectControl();
        }

        private void ptbImage_Leave(object sender, EventArgs e)
        {
            DeSelectControl();
        }

        private void selectablePicture_Leave(object sender, EventArgs e)
        {
            DeSelectControl();
        }

        private void DeSelectControl()
        {
            //If none of the controls inside the usercontrol have focus, set this control to white.
            if (!chkSelected.Enabled == false)
            {
                if (!this.Focused && !this.ptbImage.Focused && !this.chkSelected.Focused)
                {
                    this.BackColor = Color.White;
                }
            }            
        }
    }
}

И вот как я его использую:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WebServiceScanner
{
    public partial class MainForm : Form
    {
        int pictureXPosition = 0;
        List<selectablePicture> Images;

        public MainForm()
        {
            InitializeComponent();
            ptbNewestPicture.BackgroundImageLayout = ImageLayout.Zoom;
            Images = new List<selectablePicture>();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            LoadImageFromScanner();
        }

        private void scanToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LoadImageFromScanner();
        }

        private void scanBatchToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LoadBatchImagesFromScanner();
        }

        private void btnScanBatch_Click(object sender, EventArgs e)
        {
            LoadBatchImagesFromScanner();
        }

        private void connectionSettingsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ShowConfigurationForm();
        }


        private void LoadImageFromScanner()
        {            
            selectablePicture picture = new selectablePicture(Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg"));
            ptbNewestPicture.BackgroundImage = picture.GetImage();

            picture.Location = new Point(pictureXPosition + panel1.AutoScrollPosition.X, 0);
            panel1.Controls.Add(picture);            
            pictureXPosition += 130;
        }

        private void LoadBatchImagesFromScanner()
        {
            throw new NotImplementedException();
        }

        private void ShowConfigurationForm()
        {
            ConnectionSettingsForm connectionConfig = new ConnectionSettingsForm();
            connectionConfig.ShowDialog();
        }

        private void btnDeleteSelected_Click(object sender, EventArgs e)
        {
            DeleteSelectedPictures();
        }

        private void DeleteSelectedPictures()
        {
            foreach (Control c in panel1.Controls)
            {
                if (((selectablePicture)c).IsSelected())
                {
                    DisablePicture(c);
                    Images.Remove((selectablePicture)c);
                }
            }
        }

        private void DisablePicture(Control c)
        {
            c.BackColor = Color.Gray;
            ((selectablePicture)c).DisableCheckbox();
        }
    }
}

Я думал о поддержаниисписок моего пользовательского элемента управления и перерисовывать весь список каждый раз, когда что-то меняется, но это не хорошо, потому что, что происходит, если есть много изображений?

Любое руководство?

Какие шаги предпринятьМне нужно следить, если я хочу, чтобы иметь возможность перетаскивать и изменять порядок изображений?Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 ноября 2010

Используйте FlowControlPanel вместо простого Panel.Затем вы можете добавлять и удалять элементы управления, и они будут выстраиваться в линию.

2 голосов
/ 21 ноября 2010

Одним из решений было бы не отображать их как элементы управления, а создать элемент управления, который отображает миниатюры слева направо (изменяя отображение выбранного изображения в зависимости от того, выбрано оно или нет).

Удаление изображения теперь тривиально, оно просто удалено. Тогда вам больше не нужно беспокоиться об этом, его больше нет в вашем списке рендеринга. Снятие контроля не требуется.

Издержки этого пользовательского элемента управления будут меньше (1 элемент управления против 'N' элементов управления для каждого изображения).

Есть много других преимуществ, которые вы можете теперь легко сделать, таких как применение эффектов к близлежащим изображениям, и т. Д. И т. Д. Конечно, это можно сделать с помощью отдельных элементов управления, но таким образом это НАМНОГО меньше болит.

Некоторые показатели

N        = Total number of images
T_WIDTH  = Thumbnail width
MARGIN_W = Margin you want either side of the thumbnail
CELL_W   = T_WIDTH + (MARGIN_W * 2)   (Total width of a cell that contains a thumbnail)

// Pseudo code here!!!
Scrollbar.Width = CELL_W * N
Scrollbar.PageWidth = Control.ClientWidth / CELL_W

Индекс изображения, чтобы начать рендеринг в

Scrollbar.Pos / CELL_W

Не забудьте сместить фактическое x-положение, с которого вы начинаете рендеринг, в зависимости от того, где эта позиция полосы прокрутки находится в пределах CELL_W.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...