Использование ElementName в ресурсе в словаре - PullRequest
0 голосов
/ 17 марта 2012

Я определил следующее в ResourceDictionary:

<DockPanel x:Key="errorDisplay" LastChildFill="False">
        <Border Background="Red" DockPanel.Dock="Top">
            <TextBlock x:Name="errorTextBlock" />
        </Border>
        <Canvas DockPanel.Dock="Top" Height="15">
            <Polygon 
                Points="{Binding ElementName=errorDisplay, Path=ActualWidth, Converter={StaticResource PointsToStringArrayConverter},Mode=OneWay}"
                Fill="Red" Stroke="Black" StrokeThickness="1" />                
        </Canvas>
</DockPanel>

Этот ресурс добавляется в слой рекламного кода в коде при загрузке пользовательского элемента управления.

Однако я получаю ошибку привязки

(Не удается найти источник для привязки со ссылкой 'ElementName = errorDisplay')

.Мне известны области имен, но, безусловно, вышеприведенное должно работать, поскольку все это происходит в пределах одного составного элемента управления с применением одного и того же именного поля?

EDIT (использование RelativeSource / AncestorType вместо elementname, похоже, также не работает.) Работает!Но фактическая ширина равна Nil

EDIT: использование ElementName = errorTextBlock также приводит к той же ошибке привязки!

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Вы используете ElementName=, указывая на x:Key, который не совпадает. Однако вы не можете использовать x:Name для ссылки. В MSDN трудно понять, почему его нельзя использовать, но, вероятно, его можно найти, собрав все воедино.
Я предполагаю, что именная область не зарегистрирована для элементов в ResourceDictionary, только для элементов в элементе в словаре ресурсов. Удар F1 на ResourceDictionary.FindName получил меня это: http://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary.findname.aspx где написано: «Не поддерживается этой реализацией словаря». Думаю, это не ответило бы на это, но дает мне понимание, что мы не можем легко сделать это сами.

В качестве ответа на ваш вопрос: Это работает для меня:

ResourceDictionary:

<DockPanel x:Key="errorDisplay" LastChildFill="False">
    <Border Background="Red" DockPanel.Dock="Top">
      <TextBlock x:Name="errorTextBlock" />
    </Border>
    <Canvas DockPanel.Dock="Top" Height="15">
      <Polygon Points="{Binding RelativeSource={RelativeSource AncestorType=DockPanel}, Path=ActualWidth, Converter={StaticResource PointsToStringArrayConverter},Mode=OneWay}" 
               Fill="Red" Stroke="Black" StrokeThickness="1" />
    </Canvas>
  </DockPanel>

MainWindow:

<ContentPresenter Content="{StaticResource errorDisplay}"/>

Преобразователь:

  public class PointsToStringArrayConverter : IValueConverter
  {
    public object Convert( object value , Type targetType , object parameter , System.Globalization.CultureInfo culture )
    {
      if ( !( value is double ) ) { return value; }
      var dbl = ( double )value;
      PointCollection p = new PointCollection( );
      p.Add( new Point( dbl , dbl ) );
      p.Add( new Point( dbl/2 , dbl ) );
      p.Add( new Point( dbl , dbl/2 ) );
      p.Add( new Point( dbl /2, dbl/2 ) );
      return p;
    }

    public object ConvertBack( object value , Type targetType , object parameter , System.Globalization.CultureInfo culture )
    {
      throw new NotImplementedException( );
    }
  }

Вы сказали, что уже пытались использовать RelativeSource, но попробуйте установить точку останова в конвертере и посмотрите, сработает ли она.

Для получения дополнительной информации: Наименования: http://msdn.microsoft.com/en-us/library/ms746659.aspx Ресурсы: http://msdn.microsoft.com/en-us/library/ms742538.aspx

1 голос
/ 17 марта 2012

Вы не назвали DockPanel, предоставили ключ ресурса.

Попробуйте <DockPanel x:Key="errorDisplay" x:Name="errorDisplay" LastChildFill="False">

Однако, как вы говорите, это не работает при тестировании.

В этой урезанной версии вашего кода работает относительная привязка к исходному тексту:

Это элемент ресурса

<DockPanel x:Key="errorDisplay" LastChildFill="False">
    <Border Background="Red" DockPanel.Dock="Top">
        <TextBlock x:Name="errorTextBlock" 
         Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DockPanel}}, Path=ActualHeight, Mode=OneWay}" />
    </Border>
</DockPanel>

и я использую это так:

<ContentControl Content="{StaticResource errorDisplay}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...