2008-12-11 51 views
1

我試圖得到一些WPF概念,所以我已經放在一起我想要做的一個簡單的例子。我想設置一個用戶控件的自定義屬性,並讓它由控件中的一個元素使用。自定義UserControl子元素使用的屬性

我一直在研究和試驗,但我並沒有完全理解這裏的一切。任何幫助,將不勝感激。

用於該示例的用戶控制是簡單的正方形,它裏面的圓:

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

我想圓顯示爲藍色(或任何其他顏色我選擇了該實例)

回答

2

對不起,轉貼,但在重新閱讀你文章後,我認爲你可能是用模板更好。我在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> 
0

您需要在CircleInSquare類中創建DependencyProperty。做一些Google搜索。像下面這樣爲你的圈子類使用屬性的概念叫做AttachedProperties,你可能需要處理CircleColorChanged事件來完成你所需要的事情。

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

我試着做一些依賴屬性的工作,但是我發現的很多例子太複雜或不清楚,或者用C#編寫。我還沒有找到一個很好的簡單例子,但我會繼續嘗試。我不確定這是否正確,因爲它不適合我。 – 2008-12-11 11:34:13

+0

一個依賴項屬性真的是你需要的。也許還有其他方法可以做到這一點,但是使用依賴屬性來實現它與WPF的整體理念是一致的。我提供了一個例子,但是我在VB中吸取了大量時間,並且你不想C#... – Boyan 2008-12-11 13:31:08

0

將橢圓的DataContext設置爲CircleInSquare類的實例。並確保在此類上使用實現INotifyProperychanged以使其屬性更改處於啓用狀態。檢查此鏈接如果您需要Propertychange

<Ellipse Name="Circle" 
      Margin="10" 
      Fill="{Binding Path= CircleColor}" 
      > 
    </Ellipse> 
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" /> 
    ... 

你也許可以用普通的屬性來完成它,但依賴項屬性支持綁定,這使得以後的樣式更容易。

HTH

相關問題