0

我有需要是取決於它是用在不同顏色的資源,所以我用這個附加屬性:自定義附加屬性沒有找到

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相關的行爲,我更喜歡這種方法。

+0

*問題是,當我們試圖用一個自定義裏面的符號像這樣的用戶控件* ...喜歡什麼?我可能會失明,但我沒有看到你的第二個使用FillBrush附加屬性的例子。 – Sheridan

+0

我在第二個例子中忽略了附加屬性的設置,以顯示它不是屬性繼承的問題。我希望得到FillBrush的默認值(紅色),但會得到綁定錯誤。很抱歉,如果這樣做不明確,我會嘗試編輯並更清楚。 – Magnus

+0

嘗試明確地指定路徑屬性{Binding Path =(main:....},它可能有助於 – Alexis

回答

1

爲了避免以下問題,請嘗試顯式指定類的路徑屬性:{綁定路徑=(主:....}

<Rectangle x:Key="SomeColorfulSymbol" x:Shared="False" Width="10" Height="10" Fill="{Binding Path=(main:AssetProperties.FillBrush), RelativeSource={RelativeSource Self}}" />