Передача значения свойства зависимости пользовательского элемента управления в элемент управления внутри него

У меня есть UserControl (составной элемент управления), который можно отобразить как следующий псевдокод XAML:

<UserControl>
  <DockPanel>
    <TextBox />
    <Button />
  </DockPanel>
</UserControl>

Я использую этот настраиваемый элемент управления во множестве мест и стилизую некоторые из них с помощью стиля WPF. Этот стиль устанавливает цвет для свойства Background элемента управления UserControl. Но этот цвет фона рисуется на поверхности фона UserControl, но я хочу, чтобы он рисовался только на фоне элемента управления TextBox. Вот что я получаю (цвет = красный):

альтернативный текст http://img261.imageshack.us/img261/8600/62858047wi3.png < / а>

Если я привяжу свойство Background элемента управления UserControl к свойству фона элемента управления TextBox, я получу следующее:

альтернативный текст http://img111.imageshack.us/img111/1637/30765795kw5.png < / а>

Теперь он также рисует фон внутреннего элемента управления TextBox, но цвет фона UserControl все еще существует. Есть ли способы удалить этот рисунок фона UserControl?


person huseyint    schedule 07.10.2008    source источник


Ответы (2)


Есть несколько способов сделать это, но я бы предложил раскрыть ваше собственное свойство в вашем пользовательском элементе управления и привязать его к нему внутри вашего пользовательского элемента управления. Например:

<UserControl x:Name="_root" ...>
    ...
    <Button Background="{Binding ButtonBackground, ElementName=_root}"/>
</UserControl>

Другой способ - просто явно установить какой-либо цвет фона для TextBox.

person Kent Boogaart    schedule 07.10.2008

Я согласен с Кентом. Есть несколько способов решить эту проблему.

Но как насчет простого использования Style в UserControl для установки фона TextBox? Есть ли какая-то особая причина, по которой следующее не сработает для вас?

<UserControl
    x:Class="StackOverflowQuestion.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300"
    Width="300"
>
    <UserControl.Resources>
        <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
            <Setter Property="Background" Value="Red"/>
        </Style>
    </UserControl.Resources>
    <DockPanel>
        <TextBox Text="Test" Style="{StaticResource textBoxStyle}"/>
        <Button/>
    </DockPanel>
</UserControl>

Если вы действительно хотите использовать свойство, установленное в пользовательском элементе управления, и повлиять на внутреннее устройство пользовательского элемента управления, я бы последовал предложению Кента с одной модификацией. Вместо этого я бы привязал фон TextBox, чтобы любая фоновая кисть, установленная пользователем в пользовательском элементе управления, передавалась (наследование значения свойства) на кнопку. Или, другими словами, Фон TextBox - это действительно то, что вы пытаетесь сделать другим.

<UserControl x:Name="_root" ...>
    <TextBox Background="{Binding TextBoxBackground, ElementName=_root}"/>
    <Button/>
</UserControl>
person cplotts    schedule 07.10.2008