Установите свойства автоматически сгенерированного ContentPresenter
Рассмотрим следующую часть визуального дерева в приложении Windows Phone SL:
Как видите, шаблон PanoramaItem содержит ссылку на статический DataTemplateSelector
, Это простой класс, который динамически передает шаблон данных на основе предоставленного ключа для отображения разных представлений для разных моделей представлений, представленных в виде 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
Вы можете увидеть выбранное на изображении выше. Чтобы получить согласованный макет, мне нужно иметь возможность установить его свойство "Вертикальное выравнивание". Я, кажется, не знаю, как я могу это сделать, так как я не могу сослаться на это ContentPresenter
, Как я могу установить свойства ContentPresenter?
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>
Я определил мой в UserControl.Resources
раздел XAML представления.
Вызов "рестайлинговой" строки кода в конструкторе класса:
public class DataTemplateSelector : ContentControl
{
public DataTemplateSelector()
{
this.DefaultStyleKey = typeof (DataTemplateSelector);
}
И вот как вы можете контролировать ContentPresenter
внешний вид элемента ContentControl
Получен контроль.
Кажется, у вас уже есть ответ, сидящий перед вами.
Использовать 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];
}
Попытка приведения происходит только один раз, а не трижды, короче и легче для понимания. Пример, где добавление переменной является полезным (тогда как обычно мы можем попытаться уменьшить количество переменных в нашем коде).