我的问题摘要:我创建了一个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
为什么绑定在此处工作而不在自定义控件中?
非常感谢,
达拉尔
答案 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
属性的更改 - 资源的查找是静态的,而不是这些资源中的属性值。