我有需要是取決於它是用在不同顏色的資源,所以我用這個附加屬性:自定義附加屬性沒有找到
public static class AssetProperties
{
public static Brush GetFillBrush(DependencyObject obj)
{
return (Brush)obj.GetValue(FillBrushProperty);
}
public static void SetFillBrush(DependencyObject obj, Brush value)
{
obj.SetValue(FillBrushProperty, value);
}
public static readonly DependencyProperty FillBrushProperty =
DependencyProperty.RegisterAttached("FillBrush",
typeof(Brush),
typeof(AssetProperties),
new FrameworkPropertyMetadata(new BrushConverter().ConvertFrom("#FFE41300"), FrameworkPropertyMetadataOptions.Inherits));
}
我們定義符號,並用它像這樣在窗口或用戶控件(這當然是簡化了很多,資源例如在一個單獨的文件中定義):
<Grid>
<Grid.Resources>
<ResourceDictionary>
<Rectangle x:Key="SomeColorfulSymbol" x:Shared="False" Width="10" Height="10"
Fill="{Binding (main:AssetProperties.FillBrush), RelativeSource={RelativeSource Self}}" />
</ResourceDictionary>
</Grid.Resources>
<ContentControl Content="{StaticResource SomeColorfulSymbol}" main:AssetProperties.FillBrush="Blue"/>
</Grid>
這按預期工作,一個漂亮的藍色矩形出現。沒有設置附加屬性,矩形是FillBrush附加屬性的默認紅色。
問題是,當我們試圖用這樣定義的自定義用戶控件內的符號:
OuterControl.xaml:
<UserControl x:Class="AttachedPropertyResourceTest.OuterControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<StackPanel>
<TextBlock Text="Some title"/>
<ContentControl Content="{Binding InnerContent, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"/>
</StackPanel>
</Grid>
</UserControl>
OuterControl.xaml.cs:
[ContentProperty("InnerContent")]
public partial class OuterControl
{
public FrameworkElement InnerContent
{
get { return (FrameworkElement)GetValue(InnerContentProperty); }
set { SetValue(InnerContentProperty, value); }
}
public static readonly DependencyProperty InnerContentProperty =
DependencyProperty.Register("InnerContent", typeof(FrameworkElement), typeof(OuterControl), new FrameworkPropertyMetadata(null));
public OuterControl()
{
InitializeComponent();
}
}
現在,如果我將ContentControl包裝在上面的代碼片段中,而不是這樣:
<main:OuterControl>
<ContentControl Content="{StaticResource SomeColorfulSymbol}"/>
</main:OuterControl>
它在VS設計器中看起來不錯,它是一個標題加上矩形,它是FillBrush的默認紅色。但是在運行時我們只能得到標題。矩形得不到的顏色(UnsetValue),我們得到這個綁定錯誤:
System.Windows.Data Error: 40 : BindingExpression path error: '(main:AssetProperties.FillBrush)' property not found on 'object' ''Rectangle' (Name='')'. BindingExpression:Path=(main:AssetProperties.FillBrush); DataItem='Rectangle' (Name=''); target element is 'Rectangle' (Name=''); target property is 'Fill' (type 'Brush')
如果我添加的包裹的前一個符號的一種無形的情況下,它的工作原理再次,即會出現一個紅色矩形:
<ContentControl Content="{StaticResource SomeColorfulSymbol}" Visibility="Collapsed"/>
<main:OuterControl>
<ContentControl Content="{StaticResource SomeColorfulSymbol}"/>
</main:OuterControl>
一個問題是附加屬性沒有註冊,當我在RegisterAttached方法上放置一個斷點時,如果沒有額外的不可見ContentControl,就不會調用它。然而,這只是問題的一部分,例如迫使這樣的註冊不起作用:
<StackPanel>
<TextBlock Text="I'm red!" Background="{Binding (main:AssetProperties.FillBrush), RelativeSource={RelativeSource Self}}"/>
<main:OuterControl>
<ContentControl Content="{StaticResource SomeColorfulSymbol}"/>
</main:OuterControl>
</StackPanel>
文本「我紅」其實是紅色和附加屬性被註冊,但我們得到的完全相同的綁定錯誤。
我也試過沒有ContentProperty["InnerContent"]
,在xaml中顯式設置InnerContent屬性,結果相同。
有人可以對此有所瞭解嗎?
也許使用控制模板而不是OuterControl不會有這個問題(?),但是有很多與OuterControl相關的行爲,我更喜歡這種方法。
*問題是,當我們試圖用一個自定義裏面的符號像這樣的用戶控件* ...喜歡什麼?我可能會失明,但我沒有看到你的第二個使用FillBrush附加屬性的例子。 – Sheridan
我在第二個例子中忽略了附加屬性的設置,以顯示它不是屬性繼承的問題。我希望得到FillBrush的默認值(紅色),但會得到綁定錯誤。很抱歉,如果這樣做不明確,我會嘗試編輯並更清楚。 – Magnus
嘗試明確地指定路徑屬性{Binding Path =(main:....},它可能有助於 – Alexis