2012-04-11 7 views
-1

DependencyPropertyRectangleに登録すると、 を動的に変更できますか?依存関係プロパティをユーザーコントロールにアタッチする

<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

<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と呼ばれる独自の依存関係プロパティを持っている場合、あなたはそれをこのようにバインドすることができます。

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

その他の変更は必要ありません。

これは、Fillプロパティをスタイルが割り当てられているコントロールの親の親にバインドします。その場合は、UserControl自体がバインドされます。

このメソッドを使用すると、UserControlのプロパティだけでなく、他のコントロールのプロパティにもバインドできます。

ボタンの Backgroundプロパティに Fillを結合しないのはなぜ
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にプロパティの値を完全に制御できますだけでなく、次のことができるようにすることができます効果的に行動をテストします。

関連する問題