Как сделать кнопку «Дополнительно» в конце списка и обработать ее? - PullRequest
2 голосов
/ 09 октября 2011

Я добавил этот ресурс на App.xaml

<Style x:Key="ListBoxMore" TargetType="ListBox">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="Padding" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBox">
                <ScrollViewer x:Name="ScrollViewer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}">
                    <StackPanel>
                        <ItemsPresenter/>
                        <Button Content="More" Name="moreButton"></Button>
                    </StackPanel>
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

И мой список добавляет этот стиль

Style="{StaticResource ListBoxMore}"

И это работает, но вопрос ...

Как я могу получить эту кнопку в коде позади? Мне нужно добавить свойства к этой кнопке и обработать щелчок, как мне получить эту кнопку?

1 Ответ

4 голосов
/ 10 октября 2011

Общий подход заключается в создании пользовательского элемента управления:

using System;
using System.Windows;
using System.Windows.Controls;

namespace WpfApplication2
{
    [TemplatePart(Name=PartMoreButtonName, Type=typeof(Button))]
    public class MyListBox : ListBox
    {
        private const string PartMoreButtonName = "PART_MoreButton";
        private Button _moreButton;

        public override void  OnApplyTemplate()
        {
            // unhook any handlers from _moreButton to prevent a memory leak

            _moreButton = GetTemplateChild(PartMoreButtonName) as Button;

            // do stuff with _moreButton, register handlers, etc.
        }
    }
}

Обратите внимание на использование строки PART_MoreButton как в TemplatePartAttribute, так и в переопределении OnApplyTemplate. Этот атрибут сообщает потребителям вашего элемента управления, что вы ожидаете, что любой ControlTemplate, который они предоставляют, должен иметь элемент управления типа Button с именем PART_MoreButton:

<StackPanel>
    <l:MyListBox>
        <l:MyListBox.Style>
            <Style TargetType="ListBox">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBox">
                            <ScrollViewer x:Name="ScrollViewer">
                                <StackPanel>
                                    <ItemsPresenter/>
                                    <Button x:Name="PART_MoreButton" Content="More"></Button>
                                </StackPanel>
                            </ScrollViewer>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </l:MyListBox.Style>
    </l:MyListBox>
</StackPanel>

Когда WPF надувает шаблон для каждого экземпляра вашего элемента управления, вызывается переопределение. В этот момент у вас будет доступ к вашей кнопке и вы сможете зарегистрировать обработчики событий и т. Д. Надеюсь, это поможет!

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