gpt4 book ai didi

c# - 在添加到列表框的控件上触发的事件

转载 作者:行者123 更新时间:2023-11-30 16:10:37 25 4
gpt4 key购买 nike

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

我已经提到了这个答案,他们说使用 CollectionChaged Event 它会在 Collection 更改时触发。所以我不能使用它,因为它会在控件添加到 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;
}
}

更新:

class ResizablePanel : StackPanel
{
protected override Size MeasureOverride(Size constraint)
{
Size calculatedSize = base.MeasureOverride(constraint);

foreach (ListBoxItem li in this.Children)
{
li.HorizontalAlignment = HorizontalAlignment.Center;
}

double greatestWidth = 0;

foreach (ListBoxItem li in this.Children)
{
if (li.Width > greatestWidth)
{
greatestWidth = li.Width;
}
}

foreach (ListBoxItem li in this.Children)
{
li.HorizontalAlignment = HorizontalAlignment.Stretch;
}

calculatedSize = new Size(greatestWidth, calculatedSize.Height);

return calculatedSize;
}
}

最佳答案

如这里所讨论的,您可以如何控制大部分尺寸方面的问题

首先定义一个新面板并覆盖方法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 (ListBoxItem item in this.Children)假设您将仅与 ListBox 一起使用。您可以根据需要进行更改。

然后将这个新面板用作

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

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

阅读更多关于 FrameworkElement.MeasureOverride 的信息


看完这里的示例后,您需要做一些更改才能获得所需的

  • 设置Margin="10,5,10,5"到侧边栏列表框

  • 添加 HorizontalAlignment="Right"到侧边栏列表框

  • 删除 HorizontalAlignment="Center"来自 metro.xaml 第 35 行的 ContentPresenter

  • 设置<Setter Property="HorizontalAlignment" Value="Stretch" /> metro.xaml 第 51 行

  • 添加 <Setter Property="TextBlock.TextAlignment" Value="Right" />在第 52 行

关于c# - 在添加到列表框的控件上触发的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25468154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com