WPF仅访问具有依赖项属性的单个派生类实例

时间:2016-03-24 18:33:11

标签: c# wpf xaml dependency-properties

我有一个派生自Button的简单类,带有依赖属性:

<Style x:Key="CircleButtonStyle" TargetType="{x:Type controls1:CircleButton}">
    ...
    <Setter Property="Content">
        <Setter.Value>
            <Rectangle Style="{StaticResource CircleButtonRectangleStyle}"/>
        </Setter.Value>
    </Setter>
    ...
</Style>

我对CircleButton有以下风格:

<Style x:Key="CircleButtonRectangleStyle" TargetType="{x:Type Rectangle}">
    <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls1:CircleButton}}, Path=Width, Converter={StaticResource ArithmeticConverter}}"/>
    <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls1:CircleButton}}, Path=Height, Converter={StaticResource ArithmeticConverter}}"/>
    <Setter Property="Fill" Value="White"/>
    <Setter Property="OpacityMask">
        <Setter.Value>
            <VisualBrush Visual="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls1:CircleButton}}, Path=Visual}"/>
        </Setter.Value>
    </Setter>
</Style>

CircleButton样式中引用的矩形样式定义为:

        <StackPanel Grid.Row="1" Grid.Column="2">
            <controls:CircleButton HorizontalAlignment="Center" VerticalAlignment="Center" Width="30.0" Height="30.0" 
                    Style="{DynamicResource CircleButtonStyle}" Command="{Binding Add}" ToolTip="Add new product filter." BorderBrush="White" BorderThickness="1" 
                                   Background="{DynamicResource AccentColorBrush}" Visual="{DynamicResource appbar_add}"/>
            <controls:CircleButton HorizontalAlignment="Center" VerticalAlignment="Center" Width="30.0" Height="30.0" 
                    Style="{DynamicResource CircleButtonStyle}" Command="{Binding Remove}" ToolTip="Remove product filter." BorderBrush="White" BorderThickness="1" 
                                   Background="{DynamicResource AccentColorBrush}" Visual="{DynamicResource appbar_minus}"/>
            <controls:CircleButton HorizontalAlignment="Center" VerticalAlignment="Center" Width="30.0" Height="30.0" 
                    Style="{DynamicResource CircleButtonStyle}" Command="{Binding Remove}" ToolTip="Remove product filter." BorderBrush="White" BorderThickness="1" 
                                   Background="{DynamicResource AccentColorBrush}" Visual="{DynamicResource appbar_music}"/>
        </StackPanel>

最后,我的XAML定义了三个CircleButton实例:

nearRadius

显示所有三个按钮,但只有序列中的最后一个按钮有一个图像(它是正确的)。无论我添加多少按钮,都会发生这种情况。

任何人都会看到我缺少什么以及我需要做些什么来纠正它?

1 个答案:

答案 0 :(得分:3)

这并不明显,但事实上你只是定义了VisualBrush的一个实例。该Setter.Value元素的内容只有一个副本。每次将它添加到您的一个圆形按钮中时,它就会从前一个按钮中拉出来。

尝试应用模板,并将该可视化笔刷应用于模板中的元素。每次应用模板时,都会单独创建模板中的元素

现在,您无法将ControlTemplate应用于Rectangle。但是你可以将很多模板应用到很多东西上,所以没什么大不了的。

这可能有用。 ButtonContentControl的子类,因此它具有ContentTemplate属性,该属性被实例化以显示您在Button的{​​{1}}属性中放置的任何内容。这种用法有点滑稽,因为它不显示Content - 但您没有使用Content

Content

但你知道<Style x:Key="CircleButtonStyle" TargetType="{x:Type controls1:CircleButton}"> <!-- ... --> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <Rectangle Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls1:CircleButton}}, Path=Width, Converter={StaticResource ArithmeticConverter}}" Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls1:CircleButton}}, Path=Height, Converter={StaticResource ArithmeticConverter}}" Fill="White" > <Rectangle.OpacityMask> <VisualBrush Visual="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls1:CircleButton}}, Path=Visual}"/> </Rectangle.OpacityMask> </Rectangle> </DataTemplate> </Setter.Value> </Setter> </Style> 是什么类型的?它是ContentControl.Content。你可以在里面填充任何内容,Object可以随心所欲地做任何事情。我敢打赌,这样可以正常工作,并且可以省去你必须编写ContentTemplate子类:

CircleButton