[英]Can't bind custom control content (WPF)
我有一個基於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"/>
有什么想法,可能有什么問題嗎?
聲明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
的限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.