Справка по шаблону пользовательского элемента управления Silverlight / WPF - PullRequest
1 голос
/ 04 декабря 2009

Я надеюсь создать элемент управления, который я называю AutoCompleteListBox. Если вы когда-либо использовали hotmail для отправки электронной почты, я хочу создать строку адреса to :. У вас есть то, что выглядит как поле ввода, и по мере ввода вы получаете выпадающий список соответствующих объектов. После выбора объекта (контакта) он добавляется в поле ввода в виде прямоугольного объекта. Таким образом можно добавить несколько объектов, и поле ввода действует как панель переноса. Вы можете удалять объекты, возвращая их назад или нажимая кнопку x на каждом.

Мой подход состоял в том, чтобы начать с создания подкласса ItemsControl. Я начал писать его шаблон управления, представляющий собой панель обтекания, в которой я хочу показать связанные элементы + текстовое поле. Я не знаю, как поместить связанные элементы и текстовое поле в одну и ту же панель переноса. Вот что у меня есть:

<Style TargetType="ctrl:AutoCompleteListBox">
    <Setter Property="Width" Value="200"/>
    <Setter Property="Height" Value="100"/>
    <Setter Property="Background" Value="White"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ctrl:AutoCompleteListBox">
                <ScrollViewer x:Name="RootScrollViewer" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" Padding="0" Background="{TemplateBinding Background}">
                    <toolkit:WrapPanel IsItemsHost="True">
                        <!--Items Bound To ItemSource Go Here-->
                        <TextBox x:Name="txtInput"/>
                    </toolkit:WrapPanel>
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>        
</Style>

Я не знаю, как выразить то, что я хочу. Я знаю, что вы можете использовать «ItemsPresenter» в шаблоне элемента управления, который показывает связанные элементы, но тогда как я могу добавить свое текстовое поле в ту же панель, что и связанные элементы?

Буду очень признателен за любую помощь. Это правильный способ даже пойти на это? Большое спасибо.

1 Ответ

0 голосов
/ 13 июня 2010

Подклассы элементов управления - хорошее начало, но я думаю, что шаблон управления должен быть немного другим. Набор инструментов Silverlight содержит отличное поле автозаполнения, которое вы можете использовать именно для этой цели. Объедините это с отдельным элементом управления элементами, и у вас должно получиться что-то, что можно будет стилизовать так, чтобы оно выглядело точно так же, как поле «Кому» живой почты.

<ControlTemplate>
  <toolkit:WrapPanel>
    <ItemsControl ItemsSource="{TemplateBinding Items}">
      <ItemsControl.ItemsPanel>
        <StackPanel Orientation="Horizontal"/>
      </ItemsControl.ItemsPanel>
      <ItemsControl.ItemTemplate>
        <!-- Add data template for the previously added items here -->
      </ItemsControl.ItemTemplate>
    </ItemsControl>
    <toolkit:AutoCompleteBox ItemsSource="{TemplateBinding AutoCompleteItems}" />
  </toolkit:WrapPanel>
</ControlTemplate>
...