iv'e得到了一个自定义面板,它派生自堆叠面板
此面板的布局逻辑取决于面板的垂直对齐方式
政务司司长:
public class ReArrangeStackPanel : StackPanel
{
protected override Size ArrangeOverride(Size arrangeSize)
{
double delta = this.VerticalAlignment == System.Windows.VerticalAlignment.Bottom
? CalcForBottom() : CalcForTop();
ChildrenArrangement(delta);
return base.ArrangeOverride(arrangeSize);
}1)我希望ItemsPanel的VerticalAligment属性是从它所属的items控件继承的,但似乎并非如此,因为它被设置为默认的"Stretch“值。
2)即使在ItemsPanel上显式地设置了VerticalAlignment,如果我不对该值进行硬编码,则VerticalAlignment在ArrangeOverride作用域中将被设置为"Stretch“,并且仅在稍后(我使用snoop观察到)才被设置为"Bottom”值。
XAML:
a)不起作用:使用绑定时,只能在ArrangeOverride之后设置值。
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<local:ReArrangeStackPanel
VerticalAlignment="{Binding Path=VerticalAlignment,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:PipeControl}}}" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>b)工作:显式地硬编码值。
<ItemsPanelTemplate>
<local:ReArrangeStackPanel VerticalAlignment="Bottom" />
</ItemsPanelTemplate>在我的Windows XAML中,ItemsControl (PipeControl)被设置为所需的VerticalAlignment。
所以我的问题是:
1)为什么不继承?
2)为什么不在ArrangeOverride发生前通过绑定来设置?
提前谢谢。
发布于 2013-03-28 00:28:45
FrameworkElement.VerticalAlignment的缺省值是Stretch,因此ReArrangeStackPanel.VerticalAlignment类的缺省值也是Stretch是合理的
由于WPF控件的典型大小调整样式通常基于父面板,因此StackPanel的ArrangeOverride方法可能是实际设置StackPanel的VerticalAlignment属性的方法,而您正在重写该方法。
如果确实如此,则可以通过在ArrangeOverride()方法中调用base.ArrangeOverride()来确保正确设置默认值
protected override Size ArrangeOverride(Size arrangeSize)
{
base.ArrangeOverride(arrangeSize);
...
}至于绑定不起作用的原因,我怀疑是因为Rendering occurs after DataBinding,所以直到呈现绑定到的父控件后,才会设置VerticalAlignment属性。
您可以通过在VerticalAlignment绑定中放置一个Converter并在计算时检查它的值是什么,来验证是否是这种情况。
https://stackoverflow.com/questions/15663196
复制相似问题