Пользовательский элемент управления ListBox не позволяет прокручивать - PullRequest
0 голосов
/ 03 июля 2011

Я построил элемент управления Logger поверх ListBox, и у меня возникли проблемы с получением Logger для работы (т.е. прокруткой ListBox).Вот код, который я использую:

Определение стиля в словаре ресурсов:

<Style TargetType="local:Logger">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Border x:Name="LayoutRoot">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Text="{Binding Head}" Margin="4"/>
                        <TextBlock Grid.Column="1" Text="{Binding Body}" Margin="4" TextWrapping="Wrap"/>
                    </Grid>
                </Border>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

C # аналог, в котором определен Logger:

public class LoggerMessage
{
    public string Head { get; set; }
    public string Body { get; set; }
}

public class Logger : ListBox
{
    private ObservableCollection<LoggerMessage> _log;

    public Logger() : base()
    {
        DefaultStyleKey = typeof(Logger);
        _log = new ObservableCollection<LoggerMessage>();
        for (int i = 0; i < 30; i++)
        {
            _log.Add(new LoggerMessage() { Head = "Msg: " + i, Body = "Some really long text which hopefully wraps around." });
        }
        this.ItemsSource = _log;
    }

    public void log(LoggerMessage item)
    {
        _log.Add(item);
    }
}

После небольшого исследованияметодом проб и ошибок, я придумал шаблон стиля (см. ниже), который решает проблему, но я не могу понять, почему он не работал в версии 1. Почему я должен явно «переопределить» ScrollViewer в ControlTemplate

<Style TargetType="local:Logger">
    <!-- Begin - Redef of ControlTemplate -->
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:Logger">
                <ScrollViewer x:Name="ScrollViewer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}">
                     <ItemsPresenter/>
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <!-- End - Redef of ControlTemplate -->
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="{Binding Head}" Margin="4"/>
                    <TextBlock Grid.Column="1" Text="{Binding Body}" Margin="4" TextWrapping="Wrap"/>
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

Заранее благодарим за любые объяснения.

С уважением

1 Ответ

0 голосов
/ 03 июля 2011

После небольшого поиска в документации MSDN ( DefaultStyleKey ), кажется, что применение стиля к элементу управления является полной перезаписью.Кажется, что стиль базового класса не наследуется, как я предполагал.Документ не говорит об этом явно, но приведенный выше эксперимент приводит к этому пониманию.

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