tl; dr: Я хочу повторно использовать существующую логику компоновки предопределенной панели WPF для пользовательский класс панели WPF. Этот вопрос содержит четыре различные попытки решить эту проблему, каждая из которых имеет разные недостатки и, следовательно, другую точку отказа. Кроме того, небольшой тестовый пример можно найти ниже.
Вопрос: Как правильно достичь этой цели
Я пытаюсь написать собственный WPF panel . Для этого класса панели я хотел бы придерживаться рекомендуемых методов разработки и поддерживать чистый API и внутреннюю реализацию. Конкретно это означает:
В настоящее время я собираюсь придерживаться существующего макета, я хотел бы повторно использовать другой код компоновки панели (вместо того, чтобы снова писать код компоновки, как предлагается, например ). Для примера я объясню на основе DockPanel , хотя я хотел бы знать, как это сделать в целом, на основе любой вид Panel .
Чтобы повторно использовать логику компоновки, я собираюсь добавить DockPanel в качестве визуального дочернего элемента в моей панели, который затем будет удерживать и компоновать логические дочерние элементы моей панели.
Я пробовал три разные идеи о том, как это решить, и еще один был высказан в комментарии, но каждый из них до сих пор терпит неудачу в другой точке:
1) Внесите внутреннюю панель макета в шаблон управления для настраиваемой панели
Это похоже на самое элегантное решение. Таким образом, панель управления для настраиваемой панели может содержать ItemsControl , чья ItemsPanel свойство использует DockPanel , а привязано к Children property пользовательской панели.
2) Предоставьте список дочерних элементов моей панели, который является всего лишь оберткой вокруг списка дочерних элементов внутренней панели
Такой класс выглядит так, как показано ниже. Я подклассифицировал UIElementCollection в моем классе панели и вернул его из переопределенной версии > CreateUIElementCollection . (Я только скопировал методы, которые на самом деле вызываются здесь, я реализовал другие, чтобы выбросить NotImplementedException , поэтому я уверен, что никакие другие переопределяемые элементы не были вызваны.)
Using System; using System.Windows; using System.Windows.Controls; namespace WrappedPanelTest { public class TestPanel1: Panel { private sealed class ChildCollection: UIElementCollection { public ChildCollection(TestPanel1 owner) : base(owner, owner) { if (owner == null) { throw new ArgumentNullException("owner"); } this.owner = owner; } private readonly TestPanel1 owner; public override int Add(System.Windows.UIElement element) { return this.owner.innerPanel.Children.Add(element); } public override int Count { get { return owner.innerPanel.Children.Count; } } public override System.Windows.UIElement this { get { return owner.innerPanel.Children; } set { throw new NotImplementedException(); } } } public TestPanel1() { this.AddVisualChild(innerPanel); } private readonly DockPanel innerPanel = new DockPanel(); protected override UIElementCollection CreateUIElementCollection(System.Windows.FrameworkElement logicalParent) { return new ChildCollection(this); } protected override int VisualChildrenCount { get { return 1; } } protected override System.Windows.Media.Visual GetVisualChild(int index) { if (index == 0) { return innerPanel; } else { throw new ArgumentOutOfRangeException(); } } protected override System.Windows.Size MeasureOverride(System.Windows.Size availableSize) { innerPanel.Measure(availableSize); return innerPanel.DesiredSize; } protected override System.Windows.Size ArrangeOverride(System.Windows.Size finalSize) { innerPanel.Arrange(new Rect(new Point(0, 0), finalSize)); return finalSize; } } }
Это работает почти правильно; макет DockPanel используется повторно, как ожидалось. Единственная проблема заключается в том, что привязки не находят элементов управления в панели по имени (с ElementName свойство).
Я попытался вернуть внутренние дети из свойства LogicalChildren , но это ничего не изменило:
Protected override System.Collections.IEnumerator LogicalChildren { get { return innerPanel.Children.GetEnumerator(); } }
Кроме того, элементы управления также не могут быть сфокусированы, например. нажав Tab . Я не знаю, как это исправить.
Кроме того, я немного опасаюсь идти этим путем, так как не знаю, какие внутренние связи между внутренней панелью и исходным списком детей я нарушаю, заменив этот список дочерних объектов на пользовательский объект.
4) Наследовать непосредственно из класса панели
Пользователь Clemens предлагает напрямую наследовать мой класс от DockPanel . Однако есть две причины, почему это не очень хорошая идея:
В качестве тестового примера для наблюдения описанных проблем добавьте экземпляр настраиваемой панели, протестированной в XAML, и внутри этого элемента добавьте следующее:
Текстовый блок должен быть оставлен из текстового поля, и он должен показывать все, что в настоящее время написано в текстовом поле.
Я ожидал бы, что текстовое поле будет доступно для кликов, а выходное представление не будет отображать какие-либо ошибки привязки (так что привязка также должна работать).
Таким образом, мой вопрос:
«Шеф-редактор блога GetGoodRank, веб-аналитик, блоггер.
Приводим короткий гид по идеям, как использовать контент повторно. В какие новые форматы лучше конвертировать старые публикации?»
Если вы публикуете контент один раз, вы не используете его потенциал по полной. Переработка старого контента занимает меньше времени, а эффект в разы лучше. Более того, конвертируя контент из одного формата в другой, вы улучшаете его восприятие целевой аудиторией. Ведь не секрет, что пользователи по разному воспринимают графику, текст, видео, звук. Предлагаем простые идеи переработки старого контента с пользой для контент-плана и аудитории.
Публикация в блоге конвертируется в видео материал, подкаст, рассылку, серию твитов, печатную версию (буклет, листовка, печатный промо-материал).
Интервью конвертируется в презентацию, видео, новую публикацию в блоге в форме статьи, изображения для социальных сетей (Pinterest, Instagram), публикации для Facebook, LinkedIn, ВКонтакте.
Подборка тематических постов конвертируется в электронную книгу (для генерации новых подписок), серию подкастов (для увеличения охвата аудитории и представленности компании на таких площадках как Zvooq, SoundCloud), в одностраничник.
Для повторного использования подходят публикации, соответствующие одному или нескольким из следующих критериев:
При повторном использовании контента важно:
Пластиковые и картонные контейнеры для яиц, во-первых, можно повторно использовать по прямому назначению. Если покупать яйца нефасованными, то они обойдутся дешевле, так как не придётся переплачивать за упаковку. А чтобы было удобно транспортировать их, используйте уже имеющийся контейнер.
Во-вторых, картонные ячейки отлично подходят для выращивания рассады перед перемещением её в открытый грунт или .
Balconygardenweb.com
В-третьих, на картонные ячейки можно поставить перегревающийся при работе ноутбук. Рельефная поверхность контейнера не будет мешать доступу воздуха для охлаждения устройства.
Молотые кофейные зёрна пригодны к использованию и после того, как напиток сварен и выпит, но уже в косметических целях. Из них получается эффективный . Самый простой вариант - просто потереть кожу влажной массой.
Несколько лет назад хозяйки смеялись над теми, кто покупал тряпки для уборки, ведь для этого можно использовать изношенные вещи. Сейчас ситуация поменялась, и странно смотрят скорее на тех, кто моет полы старой майкой. Тем не менее использовать для уборки отслуживший текстиль экологично и экономично.
Ещё один давно известный, но подзабытый вариант - разорвать трикотаж на полоски и связать из них коврик. При некоторой аккуратности получится полное .
Если вы так и не прониклись идеей купить и носить её с собой и продолжаете покупать пакеты, хотя бы найдите им повторное применение. Например, пластиковое изделие можно взять с собой, когда в следующий раз пойдёте за покупками. А потом оно отлично заменит мусорный пакет.
Стеклянные ёмкости из-под солений, кофе и других продуктов превратятся в обычные банки, если с них смыть этикетки. Проблемой могут стать брендированные крышки, но купить только крышку будет гораздо дешевле, чем посуду целиком. Банки можно использовать в качестве подсвечников, ваз для цветов, ёмкостей для хранения пищевых продуктов или разных мелочей.
Старой зубной щёткой удобно отмывать щели и труднодоступные места, швы на плитке и даже овощи.
Не выбрасывайте отслужившую своё шапочку для душа. Её можно использовать, чтобы быстро упаковать обувь, закрыв грязную подошву. И не придётся тратиться на чехол для ботинок.
Шнурки и ленты пригодятся для упаковки подарков и перевязывания всего, что можно перевязать.
Металлический противень можно покрасить или оклеить бумагой, найти пару магнитов, и получится доска для хранения заметок и записок.
В небольших пластиковых бутылках удобно брать воду с собой. Специальная и более эстетичная ёмкость обойдётся вам значительно дороже, но разница межу ними будет заметна только на фотографиях в Instagram.
Если намотать на картонные цилиндры провода или гирлянды, то они не спутаются. Несколько цилиндров и коробка или чемодан могут превратиться в органайзер для хранения тех же проводов или других не очень мелких вещей.
Одна сломанная вешалка - это две прищепки, которыми можно закрывать пакеты с крупами.
Иногда в общепите можно увидеть, что майонез и другие соусы перелиты в бутылочки из-под кетчупа. Никто не мешает вам повторить этот фокус дома и не тратиться на специальные ёмкости. Заодно можно сэкономить, покупая соусы в больших, но неудобных для использования банках.
Глянцевые издания можно сдать в макулатуру, а можно сделать из них пуфик или прикроватную тумбочку. В первом случае сверху нужно закрепить подушку, во-втором - ограничиться журналом с более-менее твёрдой обложкой.
Ведёрки из-под майонеза, контейнеры из-под плавленого сыра и другие подобные ёмкости сделаны из пищевого материала, отлично выполняют свои функции и уже у вас есть. Так что можно обойтись без покупки подобной посуды.
Из старого чемодана может получиться комфортный лежак для домашнего питомца. А чтобы сделать лежанку мягкой, пригодятся полотенца из одного из предыдущих пунктов (до того, как ими помыли полы, разумеется).
В старых варежках можно хранить солнцезащитные очки, которые не поцарапаются и не разобьются в таком чехле. Для красоты можно отрезать отделение для пальца на рукавице и аккуратно его зашить, но и в первозданном виде варежка отлично справится со своей задачей.
1 отзывПродолжаем раздел "Рукоделие " и подраздел " " статьёй вещей. Где предлагаем вашему вниманию несколько примеров того, как можно повторно и использовать то, чем уже пользовались — и принести пользу не только себе (оригинальностью), но и окружающей среде (безотходностью).
Рукоделие и повторное использование вещей на самом деле неразрывно связаны сотни лет. Так, например, квилтинг и из ткани — это не что иное, как повторное использование в других случаях не нужных обрезков ткани. Или техника кракелюра, состаривания — также делается на уже использованных вещах. Сегодня же обратим внимание на более промышленные предметы и их использование. Кстати, подобная тема уже затрагивалась в статьях
И многие другие. Начнём мы демонстрацию примеров повторного использования вещей в рукоделии с повторного использования теннисных ракеток. Странное начало, конечно — но вдруг вы обладаете кучей теннисных ракеток, которые уже не применяете по назначению? Тогда вы можете сделать из них что-то типа декоративной и ширмы, загородки, перегородки:
Раз уж мы затронули теннис, то обратим внимание на применение второй его части — теннисных мячиков. В качестве удобного массажного анатомического кресла:
Теперь переходим к способу безотходного применения стеклянных бутылок.
Кстати, повторное применение бутылок мы затрагивали в статьях "Дома из пластиковых бутылок ", "Что можно сделать из пластиковых бутылок? ", так что обращайтесь 🙂
От пластиковых бутылок можем плавно перейти к пластиковым канистрам от разнообразных веществ. А канистры можно приспособить повторно не менее оригинально:
Продолжаем аналогию с лампами и смотрим, что можно сделать с использованными пластиковыми стаканчиками:
Экология потребления. Лайфхак: В нашем доме много вещей, которые мы готовы выбросить, но это не мусор. Почему не проявить креативность и не дать им новую жизнь?
В нашем доме много вещей, которые мы готовы выбросить, но это не мусор. Почему не проявить креативность и не дать им новую жизнь?
Каждый день люди «продуцируют» тонны мусора, который загрязняет окружающую среду.
В виду этой большой проблемы многие эксперты предлагают разные решения и проекты, которые побуждали бы людей использовать мусор повторно и уменьшить «мусорную нагрузку» на природу.
Научиться использовать повторно вещи, предназначенные в мусор, нелегко. Но зная, что это возможно, можно этого добиться.
В наших домах много вещей, на которые мы смотрим, как на мусор, но которые на самом деле - не мусор. Мы поделимся некоторыми идеями о том, как можно снова использовать вещи, которые кажутся бесполезными.
Если мы хотим быть «дружественно настроены» по отношению к окружающей среде, воду в бутылках лучше вообще не покупать. Иногда у нас просто нет другого выхода, и мы вынуждены это делать. Но мы можем, по крайней мере, не превращать пластиковые бутылки в мусор, а найти им другое применение.
Почему бы не превратить их в маленькие горшочки?
Твои джинсы вышли из моды или они стали тебе малы? Если никто больше не хочет их носить или ты хочешь превратить их во что-то полезное для тебя, есть много вещей, которые можно сделать из них.
Этот предмет кухонной утвари нам постоянно хочется заменить на новый, так как он быстро теряет «товарный вид».
Но не нужно спешить его выбрасывать, его вполне можно использовать по-другому.
За неделю мы обычно выбрасываем одну или две консервные банки. Зачем это делать, если мы можем найти им вполне практичное применение?
Это один из предметов, которые использовать повторно очень легко. Из картонных коробок можно сделать много разных вещей, и, если приложить к этому фантазию, они могут получиться очень красивые.
Перегоревшие лампочки классической формы можно использовать для украшения дома.
Стекло придает вещам налет элегантности, и мы можем это использовать.
Проявив креативность, можно найти разные применения для обычной картонки из-под яиц.
Присоединяйтесь к нам в