无法绑定自定义控件内容(WPF)

时间:2014-05-07 11:29:44

标签: .net wpf xaml path resources

我有一个基于Button的简单自定义控件:

<Style TargetType="{x:Type local:ArrowButton}">

    <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
    <Setter Property="BorderBrush" Value="{StaticResource NormalBorderBrush}"/>
    <Setter Property="Focusable" Value="True"/>

    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ArrowButton}">
                <Grid>
                    <Ellipse Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}"/>
                    <ContentPresenter/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

它没有任何重要的C#代码:

public class ArrowButton : Button, IDisposable
{
    static ArrowButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ArrowButton), new FrameworkPropertyMetadata(typeof(ArrowButton)));
    }
}

如果我以下列方式使用此控件(在某些UserControl中),它可以正常工作(我有两个带黑色三角形的按钮):

    <Grid.Resources>
        <Style TargetType="local:ArrowButton">
            <Setter Property="Width" Value="30"/>
            <Setter Property="Height" Value="30"/>
        </Style>
    </Grid.Resources>

    <local:ArrowButton Grid.Column="0" HorizontalAlignment="Left">
        <Path HorizontalAlignment="Center" VerticalAlignment="Center" Fill="Black" Data="M  0 0 L 0 20 L 10 10 Z"/>
    </local:ArrowButton>
    <local:ArrowButton Grid.Column="1" HorizontalAlignment="Right">
        <Path HorizontalAlignment="Center" VerticalAlignment="Center" Fill="Black" Data="M  0 0 L 0 20 L 10 10 Z"/>
    </local:ArrowButton>

但如果我将Path移动到StaticResource而不是一个奇怪的效果:只有最后一个按钮有黑色三角形,UserConltrol上的所有其他按钮都保持为空(看起来只有Path绑定一次)。

    <Grid.Resources>
    <Path x:Key="ArrowPath" Fill="Black" Data="M  0 0 L 0 20 L 10 10 Z"/>
    </Grid.Resources>

    <local:ArrowButton Content="{StaticResource ArrowPath}" Grid.Column="0" HorizontalAlignment="Left"/>
    <local:ArrowButton Content="{StaticResource ArrowPath}" Grid.Column="1" HorizontalAlignment="Left"/>

任何想法,可能出现什么问题?

1 个答案:

答案 0 :(得分:1)

在声明Path资源时,您需要使用x:Shared="False"

<Path x:Key="ArrowPath" x:Shared="False" Fill="Black" Data="M  0 0 L 0 20 L 10 10 Z"/>

否则,将使用相同的Path对象,这将一遍又一遍地更改Path的可视父级(直到它停止到最后ArrowButton)。设置x:Shared="False"将在每次消耗时创建Path对象的新实例,这将解决您的问题。

确保您还阅读了链接页面底部列出的WPF中可以使用x:Shared的位置的限制。