2010-09-30 2 views
0

Хорошо ... это своего рода двухпартер здесь. (На самом деле, на самом деле это просто один. В любом случае, я так надеюсь.)Изменить или «настроить» существующий шаблон управления TreeViewItem?

Во-первых, можно ли, в основном, указать только объект XAML в элементе управления шаблона? Например, если в шаблоне элемента управления есть ContentPresenter с именем «PART_Foo», и мы хотим конкретно установить HorizontalAlignment на этот конкретный элемент в «Stretch» ​​с помощью чистого стиля, можно ли это сделать? Я знаю, что мы можем сделать это в переопределении OnApplyTemplate подкласса, где мы явно ищем элемент управления по имени, затем задаем свойство в коде, но опять же, мы надеемся на решение XAML, поэтому мы можем сделать это строго через стиль а не подклассы, которые в большинстве случаев не поощряются, за исключением конкретных сценариев использования.

Кроме того, мы делаем не. Вам нужно вручную указать шаблон для элемента управления, так как мы хотим, чтобы текущая тема определяла, что это за шаблон, и тем самым, как выглядит элемент управления. Мы просто хотим сказать: «В любом шаблоне, выбранном темой, если есть часть с именем« foo », установите это свойство на ней с помощью чистого стиля. Если часть с этим именем не найдена, ничего не делайте!

Желание использовать только XAML-подход является большей частью из-за второй части, на которую мы нацеливаем созданный объект-контейнер, а не самого элемента управления, что означает, что он не будет прямым подклассом, так как мы приходится гасить с помощью ItemcontainerGenerators и т. д., что является реальной болью в a $$, особенно когда виртуализируется элемент ItemsControl.

Для уточнения нашей конечной целью является выделение границы BD в шаблоне TreeViewItem TreeView и установление ее присоединенного свойства «Grid.ColumnSpan» на «2» вместо значения по умолчанию «1». Это оно! Меня поражает то, что что-то настолько простое кажется почти невозможным без ручной замены всего шаблона TreeViewItem или прибегающего к решению на основе кода.

+0

Кстати, это то, чего мы хотим избежать, чтобы просто изменить одно вонючее свойство! http://msdn.microsoft.com/en-us/library/ms788727.aspx – MarqueIV

ответ

0

Нет, это невозможно с использованием только XAML. Вы бы, по крайней мере, должны были написать прикрепленное свойство для этого (которое вы могли бы использовать в XAML). И это будет работать, только если у вас нет элементов управления, создаваемых «на лету» во время выполнения, как это происходит в виртуализированных списках. Это будет выглядеть примерно так: c:TemplateHelper.ReplaceStretchForTemplateItemName="PART_Foo". В измененном обработчике вы будете использовать визуальное вспомогательное дерево этого элемента управления с помощью VisualTreeHelper и искать это имя и применять все, что хотите.

Изменение шаблона, подобного этому, является ошибочным и считается плохим. Очень похоже, что есть тема или будет в будущем, у которой нет «Part_Foo» или что «Part_Foo» - это нечто совершенно иное, чем вы ожидали. Темы и, следовательно, ControlTemplates могут быть изменены. Новые темы появятся (и будут автоматически применены к вашему приложению), поскольку Microsoft обновит свои операционные системы, и если вы будете поддерживать настраиваемые темы, дизайнеры могут придумать тему, которая отличается.

Вы можете утверждать, что это недостаток ControlTemplates и его до некоторой степени. Но затем попробуйте настроить элементы управления в виде окон (или любой другой интерфейс пользовательского интерфейса на этой планете) ... Просто, когда привыкаешь к огромному felxibilty из WPF, сложнее принять ограничения, которые в этом случае по дизайну.

+0

У меня все в порядке с таргетингом на элемент управления, который может быть или не быть там, потому что единственный другой вариант, полностью заменяющий шаблон управления TreeViewItem в любом случае, препятствует возможности контролировать тему!Если мы поместим стиль в локальные ресурсы, он переопределит тему, и если мы поместим ее там, где она может быть тематикой, это может нарушить наш дизайн, не гарантируя, что ребенок будет растянут в первую очередь. Единственная хорошая вещь - вероятность того, что TreeViewItem будет небольшим, поскольку единственным визуальным элементом является кнопка и фоновая подсветка. Все остальное связано с позицией. – MarqueIV

+1

Я по-прежнему не могу поверить, что в TreeView нет опции «полный ряд строк», и вам нужно пройти все эти обручи, чтобы создать ее! Псих!! Одна вещь, хотя ... Я просмотрел вложенные свойства, но не вижу, как это можно использовать с элементом управления элементами на контейнере. Я имею в виду, что вы должны установить свойство при создании контейнера, которое управляется его источником данных, а не только когда вы устанавливаете свойство на самом элементе управления, так что вы вернетесь в кошмар подкласса. – MarqueIV

+0

Вы пытались установить это свойство в 'ItemsContainerStyle'? Я предполагаю, что он должен применяться, когда TreeViewItem был создан. Вы можете столкнуться с некоторыми проблемами, хотя при включении виртуализации. – bitbonk

Смежные вопросы