Переупорядочение средств управления в панели перетекающего макета

13
задан ROMANIA_engineer 26 September 2017 в 03:03
поделиться

3 ответа

Это могло бы быть легче отбросить другой flowlayoutpanel в для раздела 2, затем отбросить Ваш раздел 2 средств управления в это? Тем путем видимые средства управления в Вашей верхней панели никогда не изменяются, и Вы не должны будете волноваться об упорядочивании.

5
ответ дан 1 December 2019 в 19:08
поделиться

Внутри FlowLayoutPanel.Controls - это функция метода с именем SetChildIndex (Control c, int index) , которая позволяет установить объект для определенного индекса. .

Поскольку FlowLayoutPanel использует индексы элементов управления для определения порядка их отрисовки, вы можете установить это значение для любого индекса элемента управления, с которым вы хотите поменяться местами, и он будет увеличивать индекс этого элемента управления на один и каждый последующий.

Вот отрывок из моего блога переупорядочения PictureBox в FlowLayoutPanel.

Добавьте FlowLayoutPanel в WinForm с именем flowLayoutPanel1 :

public partial class TestForm: Form
{
   public TestForm()
    {
        InitializeComponent();
        this.flowLayoutPanel1.AllowDrop = true
    }

    private void AddImageToBlog(System.Drawing.Image image)
    {
        PictureBox pbox = new PictureBox();
        pbox.SizeMode = PictureBoxSizeMode.Zoom;            
        pbox.Height = (_picturebox_height * _ScaleFactor);
        pbox.Width = (_picturebox_width * _ScaleFactor);
        pbox.Visible = true;
        pbox.Image = image;

        pbox.MouseDown += new MouseEventHandler(pbox_MouseDown);
        pbox.DragOver += new DragEventHandler(pbox_DragOver);            
        pbox.AllowDrop = true;
        flpNewBlog.Controls.Add(pbox);
    }

    void pbox_DragOver(object sender, DragEventArgs e)
    {
        base.OnDragOver(e);
        // is another dragable
        if (e.Data.GetData(typeof(PictureBox)) != null)
        {
            FlowLayoutPanel p = (FlowLayoutPanel)(sender as PictureBox).Parent;                 
            //Current Position             
            int myIndex = p.Controls.GetChildIndex((sender as PictureBox));

            //Dragged to control to location of next picturebox
            PictureBox q = (PictureBox) e.Data.GetData(typeof(PictureBox));                
            p.Controls.SetChildIndex(q, myIndex);
        }           
    }

    void pbox_MouseDown(object sender, MouseEventArgs e)
    {
        base.OnMouseDown(e);
        DoDragDrop(sender, DragDropEffects.All);
    }
}
30
ответ дан 1 December 2019 в 19:08
поделиться

Другим возможным решением является использование ViewFlipper или ViewSwitcher в качестве раздела «Content», в который включаются различные типы содержимого, между которыми требуется переключиться, и только задание представления, которое требуется отобразить (можно также выполнять анимацию на триггере/переключателе). Недостатком является то, что содержимое должно быть добавлено в основной макет, который каждый вид является дочерним по отношению к ViewFlipper/ViewSwitcher (может использоваться или также для сохранения макетов в отдельных XML-файлах).

Делегирование рендеринга коммутируемого содержимого другому действию не является таким прямым. TabHost/TabWidget допускает, что, где область содержимого хоста табуляции создается из другого действия. В качестве примера можно использовать код Tab, если необходимо выполнить его таким пути.

-121--3076001-

SetChildIndex не сбрасывает порядок элементов управления на панели раскладки. Таким образом, при выполнении FlowLayoutPanel.GetNextControl (q, true) вывод неверен.

0
ответ дан 1 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: