Как изменить поведение свойства зависимости в UserControl

#c# #wpf

#c# #wpf

Вопрос:

У меня есть пользовательский элемент управления WPF, который содержит TextBox и несколько кнопок. Теперь я хочу изменить способ обработки VerticalContentAlignment свойства пользовательского элемента управления, чтобы изменить только вертикальное выравнивание содержимого содержащегося текстового поля, а не самого пользовательского элемента управления. Итак, как я могу переопределить VerticalContentAlignment свойство зависимости пользовательского элемента управления, чтобы достичь желаемого поведения?

Комментарии:

1. Напишите ControlTemplate для UserControl, который просто игнорирует свойство VerticalContentAlignment. Затем привяжите VerticalAlignment текстового поля (или что-либо еще) к свойству VerticalContentAlignment пользовательского контроллера, например, с помощью привязки RelativeSource .

2. Хм, не могли бы вы показать мне небольшой пример. Не уверен, правильно ли я понимаю ваше предложение

Ответ №1:

Вы могли бы написать ControlTemplate для UserControl, который просто игнорирует свойство VerticalContentAlignment. Затем привяжите VerticalAlignment текстового поля к свойству VerticalContentAlignment пользовательского элемента управления, например, с помощью привязки RelativeSource.

 <UserControl ...>
    <UserControl.Template>
        <ControlTemplate TargetType="UserControl">
            <ContentPresenter
                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
        </ControlTemplate>
    </UserControl.Template>

    <Grid Background="AliceBlue">
        <TextBlock
            Text="Hello"
            VerticalAlignment="{Binding VerticalContentAlignment,
                RelativeSource={RelativeSource AncestorType=UserControl}}"/>
    </Grid>
</UserControl>
  

Тестовый пример:

 <Grid>
    <local:MyUserControl
        Height="100" 
        VerticalAlignment="Center"
        VerticalContentAlignment="Bottom"/>
</Grid>
  

Комментарии:

1. Хм, кажется, это работает, но, честно говоря, я не совсем понимаю, почему. Особенно эта строка: <ContentPresenter VerticalAlignment=»{TemplateBinding VerticalAlignment}» /> Разве это не должно заканчиваться бесконечным циклом?

2. Этой строки там нет. Существует только свойство HorizontalAlignment презентатора содержимого , привязанное к свойству выравнивания по горизонтали содержимого UserControl, и в этом суть. Нет привязки к вертикальному выравниванию ContentPresenter.

3. Хорошо, это была моя ошибка. Но тогда этот подход означает, что все остальные свойства (помимо HorizontalContentAlignment), такие как Background и т.д. также больше не работает.

4. Это всего лишь простой пример. Если предполагается, что ControlTemplate содержит больше элементов, которые привязываются к другим свойствам UserControl (с помощью других привязок шаблонов), просто добавьте их. Например. граница, которая привязывается к Background, BorderBrush и BorderThickness.