考虑Windows Phone SL应用程序中可视树的以下部分:
如您所见,PanoramaItem模板包含对静态DataTemplateSelector
的引用。这是一个简单的类,它根据提供的Key动态提供数据模板,以显示为DataContext
到PanoramaItem
提供的不同视图模型的不同视图。这是代码:
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的属性?
答案 0 :(得分:0)
你似乎已经在你面前找到了答案。
使用VisualTreeHelper.GetParent
将DataTemplateSelector
的直接视觉父级视为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
元素外观。