Как вы можете ссылаться на полностью определенный элемент управления в качестве ресурса в WPF? - PullRequest
4 голосов
/ 21 сентября 2010

Мне известно, что я могу ссылаться на стили и шаблоны из словаря ресурсов, и я их в значительной степени использую. Но как насчет полного контроля?

Я могу объявить полностью определенный элемент управления WPF, например кнопку, в файле app.xaml как ресурс. Например, файл app.xaml, определяющий кнопку, будет содержать следующее:

<Button x:Key="HelpButton" Content="?" />

Но как ссылаться на него в разметке xaml пользовательского элемента управления, чтобы кнопка отображалась?

EDIT:
В ответ на вопрос «Зачем вам это нужно?» Я согласен, что кнопка не является отличным примером (ее просто описать).

А как насчет многоугольника (я знаю, что это не элемент управления), который вы объявляете в app.xaml и хотите использовать в нескольких файлах xaml?

Ответы [ 3 ]

3 голосов
/ 21 сентября 2010

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

(Когда я говорю, что вы не можете, я имею в виду, что он не поддерживается в простом XAML; возможно, вы могли бы реализовать IValueConverter в классе, который возвращает кнопку, и связать его в XAML с содержимым содержимого контроль. И, конечно, вы можете использовать код для программного добавления и удаления кнопки из разных контейнеров по мере необходимости. Ни один из них не кажется отличным вариантом.)

0 голосов
/ 21 сентября 2010

Единственная возможность, которая имеет смысл, - это включить некоторые элементы управления в шаблон данных и использовать их.DataTemplate «наряжает» любой объект и может включать в себя полный контроль;на самом деле довольно часто проектируют пользовательские элементы управления и создают их с использованием DataTemplates;например, вы можете определить DataTemplate следующим образом:

<DataTemplate TargetType="{x:Type viewmodels:MyViewModel}">
  <Button Command={Binding MyCommand} Content={Binding MyCaption} />
</DataTemplate>

Если опция MyViewModel содержит строковое свойство MyCaption и свойство ICommand MyCommand, DataTemplate будет автоматически использоваться, если он определен в области действиявизуально отобразить экземпляр класса MyViewModel, если:

  • экземпляр установлен как свойство Content ContentControl или производного элемента управления, или
  • экземпляр является одним из многих элементов вколлекция, отображаемая с помощью ItemsControl.

Когда я говорю «в области видимости», я на самом деле имею в виду, что DataTemplate определяется в ResourceDictionary где-то в доступной иерархии элементов управления;т.е. Application.Resources, Window.Resources и т. д. до уровня Grid.Resources, если в нем размещен целевой элемент управления (ContentControl или ItemsControl).

Конечно, вы также можете указать DataTemplate без TargetType, но вместо этого с ключом x: и использовать его, вручную ссылаясь на этот ключ;например myListBox.ItemTemplate={StaticResource myKey}.

0 голосов
/ 21 сентября 2010

В качестве примечания к ответу Бена М.:

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

<UserControl.Resources>
    <local:MyToolTip x:Key="ToolTip"/>
<UserControl.Resources>
<Button ToolTip="{StaticResource ToolTip}"/>

Эта сортира работает, но вы действительно должны использовать стили для таких вещей.

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