Пользовательское свойство 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" />
...
Вы также можете сделать это с обычным свойством, но свойства зависимостей поддерживают привязку, что значительно упрощает стилизацию в дальнейшем.
НТН