2012-04-11 30 views
-1

如何註冊DependencyPropertyRectangle填充,所以我可以動態改變顏色 ?將依賴屬性附加到用戶控件

... 
<Rectangle Stroke="Black" Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Parent.Parent.MyProperty}" /> 
... 

不需要進行其他的變化:

<UserControl.Resources> 
    <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid> 
         <Rectangle Stroke="Black"> 
          <Rectangle.Fill> 
           <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
            <GradientStop Color="#FF48B6E4" Offset="0.013"/> 
            <GradientStop Color="#FF091D8D" Offset="1"/> 
           </LinearGradientBrush> 
          </Rectangle.Fill> 
         </Rectangle> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsFocused" Value="True"/> 
         <Trigger Property="IsDefaulted" Value="True"/> 
         <Trigger Property="IsMouseOver" Value="True"/> 
         <Trigger Property="IsPressed" Value="True"/> 
         <Trigger Property="IsEnabled" Value="False"/> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot"> 
    <Button Style="{DynamicResource ButtonStyle1}"/> 
    <TextBlock 
     x:Name="NodeName" 
     x:FieldModifier="public" 
     Text="Property" 
     Margin="8" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Center" 
     TextWrapping="Wrap" 
     TextAlignment="Center" 
     FontFamily="Segoe Print" 
     FontWeight="Bold" 
     Foreground="White" 
     FontSize="40"/> 
</Grid> 

回答

1

你爲什麼不綁定Fill到按鈕的Background屬性:

<ControlTemplate TargetType="{x:Type Button}"> 
    <Grid> 
     <Rectangle Stroke="Black" Fill="{TemplateBinding Background}" /> 
     ... 
    </Grid> 
    ... 
</ControlTemplate> 

,然後設置Background這樣的:

<Button Style="{DynamicResource ButtonStyle1}"> 
    <Button.Background> 
     <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
      <GradientStop Color="#FF48B6E4" Offset="0.013"/> 
      <GradientStop Color="#FF091D8D" Offset="1"/> 
     </LinearGradientBrush> 
    </Button.Background> 
</Button> 
1

如果你在你的UserControl註冊名爲MyProperty自己的依賴屬性,你可以用這種方式綁定。

這將Fill屬性綁定到指定了樣式的控件的父級父項,在您的案例中爲UserControl本身。

使用此方法,您不僅可以將其綁定到UserControl的屬性,還可以將其綁定到其他控件的屬性。

1

我會創造你的YourUserControl視圖依賴屬性,像這樣(爲了簡潔,我刪除了一些標記):

<UserControl.Resources> 
<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Grid> 
        <Rectangle Stroke="Black" Fill="{TemplateBinding Background}"> 
        </Rectangle> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Grid x:Name="LayoutRoot"> 
    <Button Style="{DynamicResource ButtonStyle1}" Background="{Binding DynamicColor}"/> 
</Grid> 

然後在YourUserControl.xaml.cs你可以創建你的依賴屬性:

private My_ViewModel _viewModel 
    { 
     get { return this.DataContext as My_ViewModel; } 
    } 

    public LinearGradientBrush DynamicColor 
    { 
     get { return (string)GetValue(DynamicColorProperty); } 
     set { SetValue(DynamicColorProperty, value); } 
    } 
    public static readonly DependencyProperty DynamicColorProperty = 
     DependencyProperty.Register("DynamicColor", typeof(LinearGradientBrush), typeof(YourUserControl), 
     new PropertyMetadata(new PropertyChangedCallback(OnDynamicColorPropertyChanged))); 

    private static void OnDynamicColorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((YourUserControl)d).OnTrackerInstanceChanged(e); 
    } 

    protected virtual void OnDynamicColorPropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
     this._viewModel.DynamicColor = e.NewValue; 
    } 

public class My_ViewModel : INotifyPropertyChanged 
{ 
    public LinearGradientBrush DynamicColor 
    { 
     get { return dynamicColor; } 
     set 
     { 
      if(dynamicColor != value) 
      { 
       dynamicColor = value; 
       OnPropertyChanged("DynamicColor"); 
      } 
     } 
    } 
    private LinearGradientBrush dynamicColor; 
} 

這種方法使您能夠將dynamicColor屬性的值完全控制以及讓你能夠單元有效地測試行爲。

相關問題