Установите свойства автоматически сгенерированного ContentPresenter - PullRequest
1 голос
/ 12 ноября 2011

Рассмотрим следующую часть визуального дерева в приложении Windows Phone SL:

Content presenter

Как видите, шаблон 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 ]

0 голосов
/ 12 ноября 2011

Решение еще раз было простым:

Определение стиля для моего производного класса 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.

0 голосов
/ 12 ноября 2011

Кажется, у вас уже есть ответ, сидящий перед вами.

Используйте 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];
            }

Попытка произнесения происходит только один раз, а не трижды, короче и проще для понимания.Пример, когда добавление переменной является полезным (тогда как обычно мы можем попытаться уменьшить количество переменных в нашем коде).

...