Установите свойства автоматически сгенерированного 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];
            }

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

Другие вопросы по тегам