Обтекание текстом ListView без указания ширины - PullRequest
2 голосов
/ 05 марта 2012

Итак, у меня есть довольно простой ListView, который имеет два столбца.Пример кода ниже:

<ListView Margin="0,0,0,10" x:Name="lvOpenItems" ItemsSource="{Binding Path=OpenItems}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="DispenserId" DisplayMemberBinding="{Binding Path=DispenserId}" Width="100"/>
            <GridViewColumn Header="ProductName" x:Name="pName" Width="200">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock TextWrapping="Wrap" Text="{Binding Path=ProductName}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

Теперь поле ProductName может иногда становиться немного длиннее, поэтому его необходимо обернуть.Приведенный выше код работает нормально;текст переноситсяТем не менее, я задаюсь вопросом, возможно ли каким-либо образом включить перенос текста без указания ширины.Прямо сейчас, если пользователь изменяет размер окна, мой столбец застрянет на 200. В идеале, я бы хотел, чтобы ProductName занимал все оставшееся пространство, а затем переносился соответствующим образом.сделать это?

1 Ответ

2 голосов
/ 05 марта 2012

В наборе ListView

  VerticalAlignment="Stretch"

Тогда используйте конвертер на колонке

  GridViewColumn Width="{Binding ElementName=lvOpenItems, Path=ActualWidth, Converter={StaticResource widthConverter}, ConverterParameter=100}"



[ValueConversion(typeof(double), typeof(double))]
public class WidthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // value is the total width available
        double otherWidth;
        try
        {
            otherWidth = System.Convert.ToDouble(parameter);
        }
        catch
        {
            otherWidth = 100;
        }
        if (otherWidth < 0) otherWidth = 0;

        double width = (double)value - otherWidth;
        if (width < 0) width = 0;
        return width; // columnsCount;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Да, этот параметр можно использовать повторно. Вам также необходимо учитывать вертикальную полосу прокрутки.

...