WPF устанавливает параметры в дочерних элементах ListBox - PullRequest
0 голосов
/ 14 января 2019

Я хотел бы динамически изменять ширину элементов в ListBox.
У меня есть этот XAML для горизонтального списка

<ListBox x:Name="listBox">
     <ListBox.ItemsPanel>
         <ItemsPanelTemplate>
              <UniformGrid IsItemsHost="True" Rows="1" />
         </ItemsPanelTemplate>
     </ListBox.ItemsPanel>
</ListBox>

со следующими .cs (часть кода DragAndDrop)

ObservableCollection<int> _List = new ObservableCollection<int>();

public void Fill(int num)
{
    for (int i = 1; i <= num; i++)
    {
       _List.Add(i);
    }
    listBox.ItemsSource = _List;

    Style itemContainerStyle = new Style(typeof(ListBoxItem));
    itemContainerStyle.Setters.Add(new Setter(ListBoxItem.AllowDropProperty, true));
    itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(s_PreviewMouseLeftButtonDown)));
    itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.DropEvent, new System.Windows.DragEventHandler(listBox_Drop)));

    listBox.ItemContainerStyle = itemContainerStyle;

}

Я бы хотел установить Rows="2" динамически, например. основанный на значении num и измените его внутри кода .cs, чтобы вместо этого установить статическое значение в XAML

1 Ответ

0 голосов
/ 14 января 2019

ItemsPanelTemplate - это просто шаблон, но после загрузки ListBox вы можете найти UniformGrid в визуальном дереве, используя следующий вспомогательный метод:

private T FindVisualChild<T>(Visual visual) where T : Visual
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
    {
        Visual child = (Visual)VisualTreeHelper.GetChild(visual, i);
        if (child != null)
        {
            T correctlyTyped = child as T;
            if (correctlyTyped != null)
            {
                return correctlyTyped;
            }

            T descendent = FindVisualChild<T>(child);
            if (descendent != null)
            {
                return descendent;
            }
        }
    }
    return null;
}

Если у вас есть ссылка на него, вы можете получить доступ к его свойствам, например ::100100

System.Windows.Controls.Primitives.UniformGrid grid = FindVisualChild<System.Windows.Controls.Primitives.UniformGrid>(listBox);
if (grid != null)
    grid.Rows = num;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...