1

我正在尝试了解一些 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 应用于控件,并将其显示为 Ellipse 的填充颜色?更好...我可以给它一个默认颜色,显示在 VS2008 Designer 中吗?

所以...如果我将其中之一放入我的窗口 XAML 中,如下所示:

<app:CircleInSquare CircleColor="Blue" />

我希望圆圈显示为蓝色(或我为该实例选择的任何其他颜色)

4

4 回答 4

2

抱歉重新发布,但在重新阅读您的帖子后,我认为您可能会更好地使用模板。我在 VB 中附加了一些示例

窗口.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>
于 2008-12-11T20:04:47.603 回答
0

您需要在 CircleInSquare 类中创建一个 DependencyProperty。做一些谷歌搜索。像下面这样为您的 circle 类使用属性的概念称为 AttachedProperties,您可能需要处理 CircleColorChanged 事件来做您需要的事情。

<Ellipse app:CircleInSquare.CircleColor="Blue" />
于 2008-12-11T04:37:22.157 回答
0

将椭圆的 DataContext 设置为 CircleInSquare 类的实例。并确保在此类上使用实现 INotifyProperychanged 以启用其属性更改。如果您需要有关Propertychange的更多信息,请查看此链接

  <Ellipse Name="Circle"
             Margin="10"
             Fill="{Binding Path= CircleColor}"
             >
    </Ellipse>
于 2008-12-11T06:01:35.293 回答
0

您像这样设置依赖项属性:

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

您也可以使用普通属性来完成此操作,但依赖属性支持绑定,这使得以后的样式更容易。

高温高压

于 2008-12-11T14:49:51.060 回答