为什么我不能再将GradientStop Color绑定到我的控件的依赖属性?

时间:2010-08-12 23:54:28

标签: c# wpf custom-controls binding dependency-properties

我的问题摘要:我创建了一个UserControl,我将我的依赖属性“Scheme”绑定到GradientStop的Color属性,它运行得很好。现在,在将我的UserControl转换为自定义控件后,此绑定不再有效,我不知道为什么。

编辑: 复制自定义控件问题:http://www.megaupload.com/?d=0006XVYD

编辑: 绑定工作的等效用户控件:http://www.megaupload.com/?d=W13GTD4E

这就是我在UserControl1.xaml文件中为UserControl声明资源字典的方法。

在UserControl1.xaml

<!-- Resources -->
<UserControl.Resources>
  <ResourceDictionary>
   <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Colors.xaml"/>
    <ResourceDictionary Source="Styles.xaml"/>
   </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</UserControl.Resources>

在Colors.xaml中,我有以下内容:

在Colors.xaml

<GradientStopCollection x:Key="colorSchemeGradient">
 <GradientStop Color="{Binding Scheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" Offset="0"/>
 <GradientStop Color="#000000" Offset="3"/>
</GradientStopCollection>

<LinearGradientBrush x:Key="colorBrush" StartPoint="0,0" EndPoint="0,1" GradientStops="{DynamicResource colorSchemeGradient}"/>

依赖属性Scheme绑定到GradientStop的颜色属性完美,完全符合我的要求。 LinearGradientBrush使用Scheme颜色创建一个渐变,该渐变从方案的颜色变为稍暗的阴影。 UserControl中有一个矩形,它使用colorBrush作为背景。这一切都很完美,我喜欢它。

现在,情况正在使我将此UserControl转换为CustomControl。我是通过获取UserControl的XAML文件并将其所有内容复制到控件模板中的Generic.xaml中来实现的。在尝试了不同的东西之后,这似乎在Generic.xaml中声明我的资源字典时非常有效:

在Generic.xaml

 <Style TargetType="{x:Type local:MyCustomControl}">

   <!-- Style Resources -->
   <Style.Resources>

   <!-- Resource Dictionaries -->
   <ResourceDictionary>
     <ResourceDictionary.MergedDictionaries>
       <ResourceDictionary Source="/MyCustomControl;component/themes/Colors.xaml"/>
       <ResourceDictionary Source="/MyCustomControl;component/themes/Styles.xaml"/>
     </ResourceDictionary.MergedDictionaries>
   </ResourceDictionary>

   </Style.Resources>

            .
            .
            .
 </Style>

现在,在我的Colors.xaml文件中,我有以下内容:

在Colors.xaml中进行自定义控制

<GradientStopCollection x:Key="colorSchemeGradient">
 <GradientStop Color="{Binding Path=Scheme, RelativeSource={RelativeSource FindAncestor, AncestorType=l:MyCustomControl}}" Offset="0"/>
 <GradientStop Color="#000000" Offset="3"/>
</GradientStopCollection>


<!-- FOR DEBUG PURPOSES -->
<TextBlock x:Key="whoaText" Text="{Binding Path=Title, RelativeSource={RelativeSource FindAncestor, AncestorType=l:MyCustomControl}}"/>

<LinearGradientBrush x:Key="colorBrush" StartPoint="0,0" EndPoint="0,1" GradientStops="{DynamicResource colorSchemeGradient}"/>

现在,由于一些我无法理解的非常令人沮丧的原因,与GradientStop的绑定不再起作用。我如何组织资源没有问题,因为我制作的调试文本块完全绑定了Title依赖属性。 GradientStop颜色不绑定到Scheme依赖项属性,这让我感到烦恼。

有人能告诉我发生了什么以及如何解决这个问题吗?

编辑:我在测试项目中复制了我的问题:http://www.megaupload.com/?d=0006XVYD

在Dictionary1.xaml中,使用x:key“text2”查看文本块。 colorBrush使用来自colorSchemeGradient的渐变色块,它使用与Scheme的绑定。但是那个绑定失败了,所以没有任何作用如果你能够使这个绑定工作,你真棒。

编辑:这是绑定有效的等效用户控件: http://www.megaupload.com/?d=W13GTD4E

为什么绑定在此处工作而不在自定义控件中?

非常感谢,

达拉尔

1 个答案:

答案 0 :(得分:3)

http://megaupload.com/?d=0006XVYD的测试项目中,您似乎拥有需要静态的DynamicResources,以及不需要的前向引用。

在Dictionary1.xaml中,将内容更改为:

<!-- Color Scheme Gradient: Used in the label background and border brush.
                                SUBTLE gradient from the colorScheme color
                                to a slightly darker shade -->
    <GradientStopCollection x:Key="colorSchemeGradient">
        <GradientStop Color="{Binding Path=Scheme, RelativeSource={RelativeSource FindAncestor, AncestorType=local:CustomControl1}}" Offset="0"/>
        <GradientStop Color="#000000" Offset="3"/>
    </GradientStopCollection>

    <LinearGradientBrush x:Key="colorBrush" GradientStops="{StaticResource colorSchemeGradient}"/>

    <TextBlock x:Key="text1" Text="{Binding Path=Name, RelativeSource={RelativeSource FindAncestor, AncestorType=local:CustomControl1}}" Foreground="Blue"/>
    <TextBlock x:Key="text2" Text="This text doesn't show!  Grr..." Foreground="{StaticResource colorBrush}"/>

我还更改了Generic.xaml中的text1和text2引用。

请注意StaticResource而不是DynamicResource在几个地方,以及重新排序以删除前向引用。如果您阅读http://msdn.microsoft.com/en-us/library/ms750613.aspx,您可能会注意到动态资源查找行为与静态有点不同。

请注意,切换到静态不会阻止控件响应Scheme属性的更改 - 资源的查找是静态的,而不是这些资源中的属性值。