【问题标题】:WPF set parameters in ListBox child elementsWPF 在 ListBox 子元素中设置参数
【发布时间】:2019-01-14 13:18:22
【问题描述】:

我想动态更改 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 中将此值设置为静态

【问题讨论】:

  • 如果有一个特定的num 值你想切换到两行,你不能只设置Columns 而不是Rows
  • @Clemens 列也可能是正确的方法!一般问题是如何从 .cs 代码更改 ListBox 内的参数
  • 像往常一样,通过数据绑定。

标签: c# wpf listbox


【解决方案1】:

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;
}

一旦你有了它的引用,你就可以访问它的属性,例如:

System.Windows.Controls.Primitives.UniformGrid grid = FindVisualChild<System.Windows.Controls.Primitives.UniformGrid>(listBox);
if (grid != null)
    grid.Rows = num;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多