Nano Hash - криптовалюты, майнинг, программирование

Заливка Panel.Dock с игнорированием других настроек Panel.Dock

Если вы создаете панель в форме и устанавливаете для нее значение Dock=Top, а затем отбрасываете другую панель и устанавливаете для нее Dock=Fill, она может заполнить всю форму, игнорируя первую панель. Изменение порядка табуляции ничего не дает.


Ответы:


1

Макет стыковки зависит от порядка родственных элементов управления. Элементы управления закрепляются "кнопкой вверх", поэтому последний элемент управления в коллекции закрепляется первым. Закрепленный элемент управления принимает во внимание только расположение ранее закрепленных элементов того же уровня. Следовательно, элемент управления с Dock=Fill должен быть первым (сверху) в порядке братьев и сестер, если вы хотите, чтобы он учитывал другие закрепленные элементы управления. Если это не первый элемент управления, более ранние элементы управления будут перекрывать его.

Это может сбивать с толку, потому что порядок братьев и сестер не обязательно совпадает с визуальным порядком, а порядок братьев и сестер не всегда очевиден в представлении дизайна.

Окно Структура документа (Просмотр -> Другие окна -> Структура документа) дает полезное древовидное представление иерархии и порядка элементов управления, а также позволяет изменить порядок элементов управления.

Вы также можете изменить порядок братьев и сестер непосредственно в дизайнере с помощью контекстного меню -> На передний план / Отправить на задний план, что перемещает элемент управления на первый или последний из братьев и сестер. Эти метки меню могут несколько сбивать с толку, поскольку фактический эффект зависит от модели макета.

При фиксированном расположении элементов управления 2D-позиция не зависит от порядка элементов одного уровня, но когда элементы управления перекрываются, элемент управления, самый ранний в порядке, будет «сверху», скрывая часть элементов одного уровня, расположенных позже в порядке. В этом контексте «Перенести на передний план/Отправить на задний план» имеет смысл.

Внутри панелей потоковой или табличной компоновки порядок создания определяет визуальный порядок элементов управления. Нет перекрывающихся элементов управления. Таким образом, вывести на передний план/отправить на задний план на самом деле означает сделать первым или последним в порядке элементов управления.

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

01.03.2010
  • у меня есть панель, полоса состояния и полоса меню в форме, и кажется, что когда я закрепляю полосу меню вверху, полосу состояния внизу и заполняю панель, панель не заполняет пространство между две полосы, если это не первая полоса того же уровня (в верхней части окна «Структура документа» над двумя полосами). Перемещение панели вниз (к последней) закрывает полоски. Так должен ли элемент управления Dock=Fill быть первым в порядке? Я читаю это неправильно? Я использую 3.5 (2008). Это изменилось? 14.07.2010
  • тл;др; Щелкните правой кнопкой мыши панель с Dock=Fill и выберите «На передний план». 15.07.2011
  • У меня есть 3 групповых ящика внутри панели, и, как и @Jugglingnutcase, я должен был их упорядочить, например: Dock.Fill, затем Dock.Bottom и, наконец, Dock.Top, чтобы они были правильно состыкованы. В любом случае классный пост! 20.07.2012
  • +1 для окна «Структура документа». Никогда не знал, что это существует, но это так полезно. 01.09.2012
  • Как я могу сделать это программно? Я имею в виду, что я добавляю элементы управления динамически, поэтому я не могу использовать для этого конструктор. 07.02.2013
  • @Camilo: Если вы добавляете элементы управления динамически, вы должны добавлять их в том порядке, в котором хотите. 20.02.2013
  • @JacquesB Итак, помимо добавления их в том порядке, в котором я хочу, нет возможности изменить их порядок позже, верно? Если не считать удаления их всех и повторного добавления, то они будут переставлены. 20.02.2013
  • Я думаю, вы можете изменить порядок коллекции элементов управления, удалив элементы управления и снова вставив их в определенные индексы. Но вам, вероятно, следует задать отдельный вопрос об этом, так как я не уверен. 21.02.2013
  • Согласитесь с @gligoran там наверху - понятия не имел, что это существует, это потрясающе! 18.06.2013
  • @JacquesB: Я могу подтвердить наряду с другими комментариями и ответами, что решение состоит в том, чтобы поместить элемент управления Dock=Fill первым в порядке братьев и сестер в структуре документа, а не последним, как описано в ответе. Вы хотите отредактировать ответ, чтобы исправить это? Или я бы с удовольствием отредактировал, но не хочу быть самонадеянным. Спасибо! 24.09.2016
  • Спасибо - это действительно полезно. 15.06.2017
  • +1: я не могу поверить, сколько времени я потерял, пытаясь понять это! Почему, черт возьми, это не задокументировано лучше? 05.11.2019

  • 2

    Щелкните правой кнопкой мыши панель с Dock=Fill и выберите «На передний план».

    Это заставляет этот элемент управления создаваться последним, что учитывает параметры Dock для других элементов управления в том же контейнере.

    30.09.2008
  • Просто, Боже, это действительно меня раздражало. 15.10.2010
  • Имеет смысл, как только вы думаете об этом. 26.02.2016

  • 3

    У меня была та же проблема, и мне удалось ее решить.
    Если у вас есть контейнер с DockStyle.Fill, у других также должен быть DockStyle, но Top или что вы хотите.
    Важно добавить элемент управления с DockStyle.Fill сначала в элементах управления, затем в остальных.

    Пример:

    ComboBox cb = new ComboBox();
    cb.Dock =  DockStyle.Top;
    
    GridView gv = new GridView();
    gv.Dock =  DockStyle.Fill;
    
    Controls.Add(gv); // this is okay
    Controls.Add(cb);
    

    но если мы сначала поставим cb

    Controls.Add(cb);
    Controls.Add(gv); // gv will overlap the combo box.
    
    11.02.2015

    4

    Другой, потенциально более чистый вариант — использовать элемент управления TableLayout. Настройте одну строку желаемой высоты для верхней док-станции и другую строку, чтобы заполнить 100% для нижней. Установите обе панели внутри на Fill, и все готово.

    (Однако к TableLayout нужно привыкнуть.)

    30.09.2008
  • TableLayout также медленнее, чем стыковочные элементы управления для производительности макета, особенно если у вас есть вложенные пользовательские элементы управления, которые используют TableLayout. Тем не менее, это действительно дает хороший макет, чтобы быть уверенным. 30.09.2008
  • Является ли эта производительность чем-то, что среднестатистический пользователь увидит в простом случае с двумя панелями, как описано выше? Или они замечают это, когда у вас есть десятки UC, все с макетами, все в одном макете? (По иронии судьбы, приложение, над которым я сейчас работаю, похоже на это, и с производительностью все в порядке...) 02.10.2008
  • TableLayout довольно легкий. Вы не увидите проблем с производительностью, если просто разместите несколько элементов управления. 02.03.2011

  • 5

    Если вы не хотите менять порядок элементов внутри кода, вы можете использовать метод Container.Controls.SetChildIndex() с Container, например, Форма, панель и т. д., в которые вы хотите добавить элементы управления.

    Пример:

         //Container ------------------------------------
         Panel Container = new Panel();
    
         //Top-Docked Element ---------------------------
         ButtonArea = new FlowLayoutPanel();
         Container.Controls.Add(ButtonArea);
         Container.Controls.SetChildIndex(ButtonArea, 1);
         ButtonArea.Dock = DockStyle.Top;
    
         //Fill-Docked Element --------------------------
         box = new RichTextBox();
         Container.Controls.Add(box);
         Container.Controls.SetChildIndex(box, 0); //setting this to 0 does the trick
         box.Dock = DockStyle.Fill;
    
    10.07.2017

    6

    У JacquesB была идея со структурой документа, но иерархия не решила мою проблему. Мои элементы управления не были в иерархическом стиле, они просто были перечислены с одним и тем же родителем.

    Я узнал, что если вы измените порядок, он исправит то, как вы хотите.

    Элементы управления в нижней части списка будут перекрывать элементы управления в верхней части списка в окне «Структура документа». В вашем случае вы должны убедиться, что первая панель находится ниже второй панели и так далее.

    07.08.2013

    7

    Вот трюк, который сработал для меня ..

    Поместите верхний элемент и закрепите его сверху.

    Поместите разделитель, а также закрепите его сверху, затем отключите его (если только вы не хотите изменить размер верхней части).

    Затем поместите объект «Заливка» и установите для параметра «Стыковка» значение «Заливка». Объект останется ниже разделителя.

    01.09.2009

    8

    Я столкнулся с той же проблемой. Мой был с добавлением новых/настраиваемых элементов управления под полосой меню во время выполнения. Проблема заключалась в том, что элементы управления при стыковке решили стыковать с верхней части формы и полностью игнорировать полосу меню, что очень раздражает, если вы спросите меня. Поскольку это нужно было делать динамически с кодом, а не в режиме разработки, это стало крайне неприятно. Самый простой способ, который я нашел, — это создать панель в режиме дизайна и закрепить ее под полосой меню. Оттуда вы можете просто добавлять/удалять элементы управления на панель, и вы можете закрепить ее во время выполнения. Не нужно возиться со всеми вашими элементами управления в форме, которые на самом деле не нужно менять, слишком много работы в зависимости от того, что вам действительно нужно сделать.

    object.dock = Fill
    Panel.Controls.Add(object)
    
    08.05.2018

    9

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

    parentForm.Controls.SetChildIndex (myPanel, 0) 
    

    В моем случае я сделал это, чтобы переместить панель Dock/Fill в качестве первого элемента управления в моей форме, чтобы он не перекрывался с другим закрепленным элементом управления, для которого установлено значение Dock/Top (полоса меню).

    01.05.2019

    10

    Также может быть быстрым решением взять заполненный компонент и щелкнуть правой кнопкой мыши, вырезать и вставить в нужную область.

    27.08.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..