设置自动生成的ContentPresenter的属性

时间:2011-11-12 12:52:51

标签: silverlight windows-phone-7 contentpresenter visual-tree

考虑Windows Phone SL应用程序中可视树的以下部分:

Content presenter

如您所见,PanoramaItem模板包含对静态DataTemplateSelector的引用。这是一个简单的类,它根据提供的Key动态提供数据模板,以显示为DataContextPanoramaItem提供的不同视图模型的不同视图。这是代码:

public static T FindResource<T>(this DependencyObject initial, string key) where T : DependencyObject
        {
            DependencyObject current = initial;

            while (current != null)
            {
                if (current is FrameworkElement)
                {
                    if ((current as FrameworkElement).Resources.Contains(key))
                    {
                        return (T)(current as FrameworkElement).Resources[key];
                    }
                }

                current = VisualTreeHelper.GetParent(current);
            }

            if (Application.Current.Resources.Contains(key))
            {
                return (T)Application.Current.Resources[key];
            }

            return default(T);
        }
    }

    public class DataTemplateSelector : ContentControl
    {
        protected override void OnContentChanged(object oldContent, object newContent)
        {
            ContentTemplate = this.FindResource<DataTemplate>(newContent.GetType().FullName);
        }
    }

问题是我无法控制您在上面的图片上看到的ContentPresenter的创建。为了获得一致的布局,我需要能够设置它的Vertical Alignment属性。我似乎不知道如何做到这一点,因为我无法引用这个ContentPresenter。如何设置ContentPresenter的属性?

2 个答案:

答案 0 :(得分:0)

你似乎已经在你面前找到了答案。

使用VisualTreeHelper.GetParentDataTemplateSelector的直接视觉父级视为FrameworkElement,然后修改其VerticalAlignment属性。

BTW: -

            if (current is FrameworkElement) 
            { 
                if ((current as FrameworkElement).Resources.Contains(key)) 
                { 
                    return (T)(current as FrameworkElement).Resources[key]; 
                } 
            } 

可以简化为: -

            var currentFE = current As FrameworkElement;
            if (currentFE != null && currentFE.Contains(key) )
            {
                return (T)currentFE.Resource[key];
            }

投射尝试只发生一次而不是潜在的三次,更短并且更容易理解。 添加变量的示例是有益的(而通常我们可能会尝试减少代码中的变量数量。)

答案 1 :(得分:0)

解决方案又简单了:

为我的ContentControl派生类定义样式:

<Style TargetType="support:DataTemplateSelector">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="support:DataTemplateSelector">
                        <ContentPresenter
                        ContentTemplate="{TemplateBinding support:DataTemplateSelector.ContentTemplate}"
                        Content="{TemplateBinding support:DataTemplateSelector.Content}" 
                        VerticalAlignment="Top"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

我在View的XAML的UserControl.Resources部分中定义了我的。

在类的构造函数中调用“restyling”代码行:

 public class DataTemplateSelector : ContentControl
    {
        public DataTemplateSelector()
        {
            this.DefaultStyleKey = typeof (DataTemplateSelector);
        } 

这就是你如何控制ContentPresenter派生控件的ContentControl元素外观。