【发布时间】:2014-08-22 09:13:32
【问题描述】:
我在网格中有一些StackPanels。它们填充有标签(所有标签的高度 > 可显示空间)。可能的 XAML 是:
<Grid>
<StackPanel>
<Label Content="bla" Background="lime" />
<Label ...>
...
</StackPanel>
</Grid>
每次Grid的大小改变时,我都需要改变StackPanel的内部内容。我需要隐藏仅部分显示的溢出Label。为此,我可以使用以下解决方案:with a Converter 和 make a new class that is inherited from StackPanel。
我想通过使用附加属性来创建不同的方式。我有以下代码:
//DepProp OverflowVisibility (double), can save height value
public static void Initialized(DependencyObject pObject, DependencyPropertyChangedEventArgs e)
{
var panel = (pObject as Panel) //the StackPanel in this case
panel.SizeChanged += panel_updateInnerLayout;
}
static void panel_LayoutUpdated(object sender, EventArgs e)
{
var parent = sender as Panel;
if(parent != null)
foreach(FrameworkElement element in parent.Children)
{
var elementPos = element.TransformToAncestor(parent).Transform(new Point(0,0));
if(element.ActualHeight + elementPos.Y >
(double)parent.GetValue(OverflowVisibilityProperty))
element.Visibility = Visibility.Hidden;
else
element.Visibility = Visibility.Visible;
}
}
以及在 XAML 中的使用示例:
<Grid>
<ItemsControl>
<ItemsPanel>
<ItemsPanelTemplate>
<StackPanel own:OverflowVisibility.OverflowVisibility="{Binding Grid height}" />
</ItemsPanelTemplate>
</ItemsPanel>
</ItemsControl>
</Grid>
每次StackPanel 改变它的大小时,我都可以使用panel_updateInnerLayout 事件处理程序更新我的标签。当StackPanel 的大小改变时,一切正常。
我的问题:StackPanel 本身不会提升SizeChanged,因为它的高度比Grid 大。我需要一个在每次Grid 改变其高度时引发的事件。
我的问题:每次更改Grid 大小时,是否会调用任何事件而不是SizeChanged?如果没有,是否有附加属性的替代方法来解决我的问题?
我还尝试将StackPanel 的高度绑定到ItemsControl ActualHeight 但它不会提高SizeChanged。
【问题讨论】:
-
尝试通过设置边距和创建动态大小的网格行和列来实现它。
-
想要达到什么效果?
-
@ErnodeWeerd 隐藏仅在
StackPanel中部分显示的溢出项(此处为标签)。 -
@ErnodeWeerd 感谢“标记为重复”链接,这通过创建一个新类解决了问题。我仍然很好奇是否可以使用该附加属性,因为我在问题中展示的工作非常接近所需的解决方案。我应该问一个新问题还是编辑它?
-
@fedab - 首先尝试编写附加属性,如果遇到特定问题,请提出新的特定问题。不要问能不能,先试试。这样一来,您就不会要求其他人做您的工作,而是在提出可回答的问题并以比其他方式更多的学习方式。