首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于ItemsPanel的VerticalAlignment

用于ItemsPanel的VerticalAlignment
EN

Stack Overflow用户
提问于 2013-03-27 23:50:26
回答 1查看 529关注 0票数 0

iv'e得到了一个自定义面板,它派生自堆叠面板

此面板的布局逻辑取决于面板的垂直对齐方式

政务司司长:

代码语言:javascript
复制
  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之后设置值。

代码语言:javascript
复制
<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)工作:显式地硬编码值。

代码语言:javascript
复制
    <ItemsPanelTemplate>
         <local:ReArrangeStackPanel VerticalAlignment="Bottom" />
    </ItemsPanelTemplate>

在我的Windows XAML中,ItemsControl (PipeControl)被设置为所需的VerticalAlignment。

所以我的问题是:

1)为什么不继承?

2)为什么不在ArrangeOverride发生前通过绑定来设置?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-03-28 00:28:45

FrameworkElement.VerticalAlignment的缺省值是Stretch,因此ReArrangeStackPanel.VerticalAlignment类的缺省值也是Stretch是合理的

由于WPF控件的典型大小调整样式通常基于父面板,因此StackPanelArrangeOverride方法可能是实际设置StackPanel的VerticalAlignment属性的方法,而您正在重写该方法。

如果确实如此,则可以通过在ArrangeOverride()方法中调用base.ArrangeOverride()来确保正确设置默认值

代码语言:javascript
复制
protected override Size ArrangeOverride(Size arrangeSize)
{
    base.ArrangeOverride(arrangeSize);

    ...
}

至于绑定不起作用的原因,我怀疑是因为Rendering occurs after DataBinding,所以直到呈现绑定到的父控件后,才会设置VerticalAlignment属性。

您可以通过在VerticalAlignment绑定中放置一个Converter并在计算时检查它的值是什么,来验证是否是这种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15663196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档