0

塗りつぶしに登録DependencyPropertyして、色を動的に変更できるようにする方法は?Rectangle

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

4

3 に答える 3

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 プロパティの値を完全に制御できるだけでなく、動作を効果的に単体テストできるようになります。

于 2012-04-11T17:18:01.497 に答える