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

Я пытаюсь изложить некоторые концепции WPF, поэтому я собрал простой пример того, что я пытаюсь сделать. Я хотел бы установить пользовательское свойство пользовательского элемента управления и использовать его в элементе управления.

Я исследовал и экспериментировал, но я не до конца понимаю все здесь. Любая помощь будет оценена.

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

<UserControl x:Class="CircleInSquare"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="100" Height="100" >
    <Grid Background="#000000">
        <Ellipse Name="Circle"
                 Margin="10"
                 Fill="?????????"
                 >
        </Ellipse>
    </Grid>
</UserControl>

Код VB За этим:

Partial Public Class CircleInSquare

    Private _CircleColor As Color

    Public Property CircleColor() As Color
        Get
            Return _CircleColor
        End Get
        Set(ByVal value As Color)
            _CircleColor = value
        End Set
    End Property

End Class

Когда я использую этот пользовательский элемент управления, как я могу применить CircleColor к элементу управления, и он будет отображаться как цвет заливки эллипса? Еще лучше... я могу дать ему цвет по умолчанию, который появляется в дизайнере VS2008?

Так что... если я помещу один из них в мой XAML-окно следующим образом:

<app:CircleInSquare CircleColor="Blue" />

Я хотел бы, чтобы круг отображался синим цветом (или любым другим цветом, выбранным для этого экземпляра)

4 ответа

Решение

Извините, что перепостил, но после перечитывания вашего поста, я думаю, что вам может быть лучше с шаблонами. Я приложил несколько образцов в VB

Window.xaml

<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:app="clr-namespace:WpfApplicationVB1"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <app:CircleInSquare Height="50" Width="50" CircleColor="Blue" SquareColor="Red"  />
    </Grid>
</Window>

CircleInSquare.xaml.vb

Partial Public Class CircleInSquare
    Public Property CircleColor() As Brush
        Get
            Return GetValue(CircleColorProperty)
        End Get

        Set(ByVal value As Brush)
            SetValue(CircleColorProperty, value)
        End Set
    End Property

    Public Shared ReadOnly CircleColorProperty As DependencyProperty = _
                           DependencyProperty.Register("CircleColor", _
                           GetType(Brush), GetType(CircleInSquare), _
                           New FrameworkPropertyMetadata(Brushes.Black))


    Public Property SquareColor() As Brush
        Get
            Return GetValue(SquareColorProperty)
        End Get

        Set(ByVal value As Brush)
            SetValue(SquareColorProperty, value)
        End Set
    End Property

    Public Shared ReadOnly SquareColorProperty As DependencyProperty = _
                           DependencyProperty.Register("SquareColor", _
                           GetType(Brush), GetType(CircleInSquare), _
                           New FrameworkPropertyMetadata(Brushes.Gray))

End Class

CircleInSquare.xaml

<UserControl x:Class="CircleInSquare"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:app="clr-namespace:WpfApplicationVB1"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UserControl.Template>
        <ControlTemplate>
        <Border x:Name="PART_Square" Height="{TemplateBinding Height}"  Width="{TemplateBinding Width}" Background="{TemplateBinding app:CircleInSquare.SquareColor}">
        <Ellipse x:Name="PART_Ellipse" Height="{TemplateBinding Height}"
                 Width="{TemplateBinding Width}" Fill="{TemplateBinding app:CircleInSquare.CircleColor}" />
            </Border>
        </ControlTemplate>
    </UserControl.Template>
</UserControl>

Установите для DataContext для эллипса экземпляр вашего класса CircleInSquare. И убедитесь, что вы используете реализацию INotifyProperychanged в этом классе, чтобы включить изменение свойства. проверьте эту ссылку, если вам нужна дополнительная информация о Propertychange

  <Ellipse Name="Circle"
             Margin="10"
             Fill="{Binding Path= CircleColor}"
             >
    </Ellipse>

Вам нужно создать DependencyProperty в вашем классе CircleInSquare. Попробуй немного погуглить. Концепция использования свойства для вашего класса круга, как показано ниже, называется AttachedProperties, и вам, вероятно, потребуется обработать событие CircleColorChanged, чтобы сделать то, что вам нужно.

<Ellipse app:CircleInSquare.CircleColor="Blue" />

Вы устанавливаете свойство зависимости следующим образом:

Public Shared ReadOnly MouseOverBrushProperty As DependencyProperty = DependencyProperty.Register("MouseOverBrush", GetType(Brush), GetType(BrushableComboBox), New UIPropertyMetadata())
Public Property MouseOverBrush() As Brush
    Get
        Return CType(GetValue(MouseOverBrushProperty), Brush)
    End Get
    Set(ByVal value As Brush)
        SetValue(MouseOverBrushProperty, value)
    End Set
End Property

И тогда в вашем xaml вы делаете что-то вроде этого

Background="{TemplateBinding MouseOverBrush}"

и вы можете установить стиль по умолчанию вне шаблона элемента управления следующим образом:

<Style TargetType="{x:Type local:BrushableComboBox}">
    <Setter Property="MouseOverBrush" Value="Blue" />
    ...

Вы также можете сделать это с обычным свойством, но свойства зависимостей поддерживают привязку, что значительно упрощает стилизацию в дальнейшем.

НТН

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