我有一个基于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"/>
有什么想法,可能有什么问题吗?
x:Shared="False"
声明Path
资源时需要使用:
<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
每次使用对象时创建一个新的对象实例,这将解决您的问题。
确保您还阅读x:Shared
了链接页面底部列出的有关在WPF中可以在何处使用的限制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句