Почему я больше не могу связывать GradientStop Color со свойством зависимости моего элемента управления? - PullRequest
0 голосов
/ 13 августа 2010

Краткое описание моей проблемы: я создал UserControl, где я связал свое свойство зависимости "Scheme" со свойством Color GradientStop, и оно работало отлично. Теперь, после преобразования моего UserControl в пользовательский элемент управления, эта привязка больше не работает, и я не знаю почему.

Так я объявил свои словари ресурсов для моего UserControl в файле UserControl1.xaml.

В 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}"/>

Свойство зависимости Привязка схемы к свойству цвета GradientStop РАБОТАЕТ Отлично, именно так, как я хочу. LinearGradientBrush использует цвет схемы для создания градиента, который переходит от цвета схемы к чуть более темному оттенку.

У UserControl есть прямоугольник, который использует colorBrush в качестве фона. Все работает отлично, и мне это нравится.

Теперь обстоятельства заставляют меня конвертировать UserControl в CustomControl. Я делаю это, беря XAML-файл моего UserControl и в значительной степени копирую все его содержимое в 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, и это меня раздражает.

Как я могу это исправить?

В Dictionary1.xaml посмотрите на текстовый блок с x:key "text2". ColorBrush использует градиентные остановки от colorSchemeGradient, который использует привязку к схеме. Однако это связывание не выполняется, и поэтому ничего не работает. Если вы можете заставить эту привязку работать, вы потрясающие.

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

1 Ответ

3 голосов
/ 13 августа 2010

В вашем тестовом проекте у вас, кажется, есть 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 - поиск ресурсов является статическим, а не значением свойств в этих ресурсах.

...