Краткое изложение моей проблемы: я создал UserControl, в котором я привязал свое свойство зависимости «Схема» к свойству Color элемента GradientStop, и он работал отлично. Теперь, после преобразования моего UserControl в настраиваемый элемент управления, эта привязка больше не работает, и я не знаю почему.
Вот как я объявил свои словари ресурсов для своего UserControl в файле UserControl1.xaml.
In UserControl1.xaml:
<!-- Resources -->
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Colors.xaml"/>
<ResourceDictionary Source="Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
В Colors.xaml у меня есть следующее:
In 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}"/>
Привязка схемы свойства зависимости к свойству цвета GradientStop РАБОТАЕТ Идеально, именно так, как я хочу. LinearGradientBrush использует цвет схемы для создания градиента, который переходит от цвета схемы к более темному оттенку.
В UserControl есть прямоугольник, который использует colorBrush в качестве фона. Все работает отлично, и мне это нравится.
Теперь обстоятельства заставляют меня преобразовать этот UserControl в CustomControl. Я делаю это, беря XAML-файл своего UserControl и практически копируя все его содержимое в Generic.xaml в шаблоне элемента управления.
Попробовав разные вещи, это, похоже, неплохо сработало для объявления моих словарей ресурсов в Generic.xaml:
In 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 не привязывается к свойству зависимости схемы, и это меня раздражает.
Как я могу это исправить?
В Dictionary1.xaml посмотрите на текстовый блок с x:key "text2". ColorBrush использует ограничители градиента от colorSchemeGradient, который использует привязку к Scheme. Однако эта привязка не выполняется, и поэтому ничего не работает. Если вы можете заставить эту привязку работать, вы молодец.
Почему привязка работает здесь, а не в настраиваемом элементе управления?