Я построил элемент управления 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>
Заранее благодарим за любые объяснения.
С уважением