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

Я вынужден использовать ListView/listbox из кода позади. В этом я должен поставить границы. Я хочу, чтобы они перешли на новую строку, когда это необходимо

ListView lsv = new ListView
{
    Width = 400,
    Height = 200,
    Background = Brushes.LimeGreen,
};
grdMain.Children.Add(lsv);

for (int iii = 0; iii < 15; iii++)
{
    Border b = new Border() { BorderThickness = new Thickness(3),
    BorderBrush = new SolidColorBrush(Colors.Blue), Width = 50, Height = 50     
};
lsv.Items.Add(b);
lsv.ItemsPanel = (ItemsPanelTemplate)XamlReader.Parse("<ItemsPanelTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><WrapPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Stretch\"/></ItemsPanelTemplate>");

Теперь с этим эффект следующий: введите здесь описание изображения

вместо этого, если я поставлю фиксированную ширину Width=\"300\"

lsv.ItemsPanel = (ItemsPanelTemplate)XamlReader.Parse("<ItemsPanelTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><WrapPanel Orientation=\"Horizontal\" Width=\"300\"/></ItemsPanelTemplate>");

он работает правильно

введите здесь описание изображения

проблема в том, что я не могу указать фиксированную ширину для панели обертки, и я хочу, чтобы она расширялась, чтобы заполнить ее родителя.

Заранее спасибо Патрик


person Patrick    schedule 14.03.2017    source источник
comment
Что произойдет, если вы установите MaxWidth вместо Width? Я имею в виду, что Width — это всего лишь предложение, тогда как MaxWidth — это ограничение.   -  person Jacob Proffitt    schedule 14.03.2017
comment
Единственное, о чем я могу думать, это может быть проблема времени, поскольку вы вызываете XamlReader.Parse после добавления элементов, тогда как вы устанавливаете свойство ширины раньше.   -  person Jacob Proffitt    schedule 14.03.2017
comment
Попробуйте установить ScrollViewer.HorizontalScrollBarVisibility в Disabled в коде позади.   -  person MoonKnight    schedule 14.03.2017
comment
@JacobProffitt Я ввел команду lsv.ItemsPanel = (ItemsPanelTemplate)XamlReader.Parse(‹ItemsPanelTemplate xmlns=\schemas.microsoft.com/winfx/2006/xaml/presentation\›‹WrapPanel Orientation=\Horizontal\ HorizontalAlignment=\Stretch\/›‹/ItemsPanelTemplate›); до цикла for, но, увы, ничего не изменилось..   -  person Patrick    schedule 14.03.2017
comment
@JacobProffitt Я изменил на ListView lsv = new ListView { MaxWidth = 400, MaxHeight = 200, Background = Brushes.LimeGreen, }; но опять без шансов...   -  person Patrick    schedule 14.03.2017
comment
@MoonKnight, где установить свойство ScrollViewer?????????   -  person Patrick    schedule 14.03.2017


Ответы (1)


Вы можете попробовать сделать следующее...

ListView listView = new ListView();
var scrollViewer = Utils.GetDescendantByType(listView, typeof(ScrollViewer)) as ScrollViewer;
scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;

Где у вас будет вспомогательный метод

public static class Utils
{
    public static Visual GetDescendantByType(Visual element, Type type)
    {
        if (element == null)
            return null;

        if (element.GetType() == type)
            return element;

        Visual foundElement = null;
        if (element is FrameworkElement)
            (element as FrameworkElement).ApplyTemplate();

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
        {
            Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;
            foundElement = GetDescendantByType(visual, type);
            if (foundElement != null)
                break;
        }
        return foundElement;
    }
}

Обратите внимание, я скомпилировал этот код, как на телефоне.

person MoonKnight    schedule 14.03.2017
comment
ТЫ МОЙ ГЕРОЙ. Я собирался плакать...спасибо - person Patrick; 14.03.2017
comment
Хороший ответ и обстоятельный и по телефону не меньше. Отличная работа. - person Jacob Proffitt; 14.03.2017