Почему я больше не могу привязать GradientStop Color к свойству зависимости моего элемента управления?

Краткое изложение моей проблемы: я создал 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. Однако эта привязка не выполняется, и поэтому ничего не работает. Если вы можете заставить эту привязку работать, вы молодец.

Почему привязка работает здесь, а не в настраиваемом элементе управления?


person Dalal    schedule 12.08.2010    source источник
comment
Не могли бы вы добавить небольшой код, например XAML для вашего CustomControl, чтобы мы могли четко видеть, где происходит сбой привязки. {наслаждаться}   -  person Micael Bergeron    schedule 13.08.2010
comment
Я отредактировал свое сообщение, включив ссылку на тестовый проект для настраиваемого элемента управления, где привязка не работает, а также добавил ссылку на тестовый пользовательский элемент управления, где привязка ДЕЙСТВИТЕЛЬНО работает. Что тут происходит? Надеюсь, у вас будет возможность проверить это.   -  person Dalal    schedule 13.08.2010


Ответы (1)


В вашем тестовом проекте у вас, похоже, есть 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}"/>

Я также изменил ссылки text1 и text2 в Generic.xaml.

Обратите внимание на StaticResource, а не на DynamicResource в нескольких местах, а также на переупорядочение для удаления прямых ссылок. Если вы читаете http://msdn.microsoft.com/en-us/library/ms750613.aspx, вы можете заметить, что поведение динамического поиска ресурсов немного отличается от статического.

Обратите внимание, что переключение на статическое НЕ мешает элементу управления реагировать на изменения свойства Scheme - поиск ресурсов статичен, а не значения свойств в этих ресурсах.

person Philip Rieck    schedule 13.08.2010
comment
Я изменил все свои DynamicResources на StaticResources, и теперь он работает, спасибо. - person Dalal; 13.08.2010