我有一个基于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"/>
任何想法,可能出现什么问题?
答案 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
的位置的限制。