【问题标题】:Set the properties of an auto-generated ContentPresenter设置自动生成的 ContentPresenter 的属性
【发布时间】:2011-11-12 12:52:50
【问题描述】:

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

如您所见,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 的创建,您可以在上面的图片中看到已选中。为了获得一致的布局,我需要能够设置它的垂直对齐属性。我似乎不知道该怎么做,因为我无法引用此ContentPresenter。如何设置 ContentPresenter 的属性?

【问题讨论】:

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


    【解决方案1】:

    你面前似乎已经有了答案。

    使用VisualTreeHelper.GetParent 获取DataTemplateSelector 的直接可视父级作为FrameworkElement,然后修改其VerticalAlignment 属性。

    顺便说一句:-

                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];
                }
    

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

    【讨论】:

    • 感谢您的提示。虽然我需要设置正好在 DataTemplateSelector(简称 DTS)下方呈现的 ContentPresenter 的值,但不是它的父级。 Target ContentPresenter 是从 ContentControl 派生的所有类的默认元素(DTS 从 ContentControl 派生),我猜,可以通过重新定义 DataTemplateSelector 的默认 ControlTemplate 来更改。我找到了如何在 XAML 中执行此操作的示例,但 DTS 是一个纯代码控件,我不知道在这种情况下如何解决。
    【解决方案2】:

    解决方案还是很简单:

    为我的 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 部分定义了我的。

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

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

    这就是您可以控制ContentPresenter 元素与ContentControl 的派生控件的外观的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 2016-04-03
      相关资源
      最近更新 更多