C# 在添加到列表框的控件上激发的事件

C# 在添加到列表框的控件上激发的事件,c#,wpf,C#,Wpf,我想知道将ListBoxItems添加到ListBox时会触发哪个事件。请注意,我不希望在数据更改时发生事件。我希望在添加控件时显示事件 我已经提到了这个答案,他们说当集合发生变化时,使用CollectionChaged事件。所以我不能使用它,因为它在控件添加到VisualTree之前触发 你可能在想我为什么需要这个。我只想将列表框的宽度更改为项目的最宽宽度。如果您对我试图实现的目标感兴趣,请查看我的代码: private void SomeEvent(object sender, ......

我想知道将ListBoxItems添加到ListBox时会触发哪个事件。请注意,我不希望在数据更改时发生事件。我希望在添加控件时显示事件

我已经提到了这个答案,他们说当集合发生变化时,使用CollectionChaged事件。所以我不能使用它,因为它在控件添加到VisualTree之前触发

你可能在想我为什么需要这个。我只想将列表框的宽度更改为项目的最宽宽度。如果您对我试图实现的目标感兴趣,请查看我的代码:

private void SomeEvent(object sender, ............... e)
{
    double greatestWidth = 0;

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(sidebar) - 1; i++)
    {
        ListBoxItem li = VisualTreeHelper.GetChild(sidebar, i) as ListBoxItem;
        li.HorizontalAlignment = HorizontalAlignment.Center;
    }

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(sidebar) - 1; i++)
    {
        ListBoxItem li = VisualTreeHelper.GetChild(sidebar, i) as ListBoxItem;
        if (li.Width > greatestWidth)
        {
            greatestWidth = li.Width;
        }
    }

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(sidebar) - 1; i++)
    {
        ListBoxItem li = VisualTreeHelper.GetChild(sidebar, i) as ListBoxItem;
        li.HorizontalAlignment = HorizontalAlignment.Stretch;
    }
}

您可以收听以下内容更改的项目集合:

        public Window1()
    {
        InitializeComponent();
        ((INotifyCollectionChanged)mylistbox.Items).CollectionChanged += myListBox_CollectionChanged;
    }

        private void myListBox_CollectionChanged(object sender,NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (var item in e.NewItems)
            {

            }
        }
    }

另外,这里您将直接获取项目,而不是使用VisualTreeHelper,这里讨论的是如何控制大多数大小调整方面

首先定义一个新面板并覆盖方法
MeasureOverride

namespace CSharpWPF
{
    class MyPanel : StackPanel
    {
        protected override Size MeasureOverride(Size constraint)
        {
            Size calculatedSize = base.MeasureOverride(constraint);
            foreach (ListBoxItem item in this.Children)
            {
                //your logic with each item
            }
            return calculatedSize;
        }
    }
}
无论何时添加或删除任何项目,或需要更改布局(即调整容器大小),都将调用MeasureOverride方法

foreach(此.Children中的ListBoxItem)
假设您将仅与ListBox一起使用。您可以根据需要进行更改

然后将此新面板用作

<ListBox xmlns:l="clr-namespace:CSharpWPF">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <l:MyPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

通过这种方法,您可以更有效地控制大小

阅读更多关于


查看示例后,这里是您需要做的更改,以获得所需的

  • 将边栏列表框设置为
    Margin=“10,5,10,5”

  • HorizontalAlignment=“Right”
    添加到侧栏列表框

  • 从metro.xaml第35行的ContentPresenter中删除
    HorizontalAlignment=“Center”

  • 设置metro.xaml 51号线

  • 在第52行添加


为什么要使用代码来执行此操作?如果您将设置水平校准,则可以使用样式来完成此操作Stretch@ethicallogics是的,我知道这可以通过使用样式来实现。但是我想要一些不同的东西。我想更改所有项目的宽度,以便它们保持不变,同时它们的宽度应完全等于包含最多字符的文本的项目的宽度。@Vishal也可以使最大项目的大小保持不变,而无需手动控制。我想你的根本问题不是你所问的。你能在屏幕上展示你的期望吗?您可以通过任何方式侦听所需控件的父级更改事件,以了解何时将控件添加到列表框。@pushpraj我的根本问题实际上就是我所问的。父级更改事件我应该侦听哪个控件??你能在不手动控制的情况下演示一下我想要的东西吗?为此,你能提供一个示例,说明如何将项目添加到列表框(侧边栏)中吗?从代码中我可以看到,您正在计算最大项目的宽度,同时保持其拉伸。作为一种替代方法,您可以为listbox使用自定义面板,并对其进行完全控制。如果我理解正确,这将给出项目,而OP正在查找控件。如果您在代码中看到,他使用VisualTree.ListBoxItem li=VisualTreeHelper.GetChild(侧栏,I)作为ListBoxItem获取ListBoxItem,则使用哪个控件;我已经按照你的建议试过了。但我还是得到了和问这个问题之前一样的结果。我的意思是,创建面板并重写其度量方法并实现所需的代码不会对输出进行任何更改。是否要调整列表框的大小?因为当前的方法将只调整“项目”面板的大小?你可以发布一个工作样本吗?是的,我想调整列表框的大小。我将在稍后上传一个示例。您可以在此处下载:以下是数据库文件:
<ListBox xmlns:l="clr-namespace:CSharpWPF">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <l:MyPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>