#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.