Ограничение высоты элементов в WPF ListBox с индикатором - PullRequest
0 голосов
/ 21 сентября 2010

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

Я сделал это достаточно легко, используя Стиль для установки MaxHeight контейнера ListBoxItem.

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

Это была моя первая попытка:

<Style x:Key="LogContainerStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="MaxHeight" Value="64" />
    <EventSetter Event="MouseDoubleClick" Handler="LogEntry_MouseDoubleClick" />
</Style>
<DataTemplate x:Key="LogTemplate">
    <Grid>
        <TextBlock Text="{Binding Message}" />
        <TextBlock x:Name="More" Text="(more)"
                   HorizontalAlignment="Right" VerticalAlignment="Bottom"
                   Foreground="DarkGray" Visibility="Collapsed" />
    </Grid>
    <DataTemplate.Triggers>
        <Trigger ... height capped at MaxHeight? ...>
            <Setter TargetName="More" Property="Visibility" Value="Visible" />
        </Trigger>
    </DataTemplate.Triggers>
</DataTemplate>

Но я не уверен, как написать триггер. Альтернативы приветствуются.

1 Ответ

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

Попробуйте код ниже.Я установил для ListBoxItem.MaxHeight значение 99. Затем я добавил триггер в DataTemplate, который проверяет ActualHeight корневого элемента в шаблоне (т. Е. «Bd» ниже), и если он равен 99, я изменяю BorderBrush.Надеюсь, это поможет.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        ShowActivated="False"
        Title="MainWindow" Height="350" Width="525">
    <ListBox x:Name="lb">
        <ListBox.ItemsSource>
            <x:Array Type="{x:Type sys:Double}">
                <sys:Double>250</sys:Double>
                <sys:Double>100</sys:Double>
                <sys:Double>50</sys:Double>
                <sys:Double>25</sys:Double>
                <sys:Double>99</sys:Double>
                <sys:Double>120</sys:Double>
            </x:Array>
        </ListBox.ItemsSource>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="MaxHeight" Value="99"/>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border x:Name="bd" BorderBrush="Black" BorderThickness="1">
                    <TextBlock Text="{Binding}" Height="{Binding}" Background="LightGray"/>
                </Border>
                <DataTemplate.Triggers>
                    <Trigger SourceName="bd" Property="ActualHeight" Value="99">
                        <Setter TargetName="bd" Property="BorderBrush" Value="Red"/>
                    </Trigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>
...