Пользовательское свойство 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" />

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

11.12.2008 04:25:45
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>
2
11.12.2008 20:04:47
Фантастический Bendewey! Я возьму концепции и применю их к своему пользовательскому элементу управления. Я знаю, что это работает, но еще не понял, почему или почему temnplating - лучший выбор. Если вы или кто-либо еще можете объяснить достоинства шаблонов в подобной ситуации, это будет оценено :-)
Ben Brandt 11.12.2008 21:16:08
Для меня это действительно сводится к тому, как вы собираетесь использовать контроль. В вашем случае вам нужно иметь гибкость в отношении содержимого элемента управления, и вы хотите предоставить содержимое элемента управления пользователям элемента управления. Шаблоны позволяют пользователям оформлять ваш контент после факта.
bendewey 11.12.2008 21:39:33
Я бы использовал Binding для данных, когда вы хотите синхронизировать данные / содержимое одного свойства с другим свойством. Другой вариант вложенных свойств действительно лучше, когда вы хотите расширить поведение вашего элемента управления до элемента управления вне вашего элемента управления.
bendewey 11.12.2008 21:41:44

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

<Ellipse app:CircleInSquare.CircleColor="Blue" />
0
11.12.2008 19:36:31
Я пытался поработать с Dependency Properties, но многие из найденных примеров были настолько сложными или неясными, либо написаны на C #. Я еще не нашел хороший простой пример, но я продолжу экспериментировать. Я не был уверен, что это правильный путь, потому что это не сработало для меня.
Ben Brandt 11.12.2008 11:34:13
Свойство зависимости действительно то, что вам нужно. Возможно, есть и другие способы сделать это, но выполнение со свойством зависимости находится в гармонии с общей философией WPF. Я бы привел пример, но я сосу много времени на VB, а вы не хотите C # ...
Boyan 11.12.2008 13:31:08
Вы знакомы с CodeSnippets. В VB есть фрагмент кода для свойств зависимостей (wpfdp, wpfdpa, wpfdpo)
bendewey 11.12.2008 19:54:34

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

  <Ellipse Name="Circle"
             Margin="10"
             Fill="{Binding Path= CircleColor}"
             >
    </Ellipse>
0
11.12.2008 06:01:35

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

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" />
    ...

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

НТН

0
11.12.2008 15:01:18