2014-02-18 3 views
0

У меня есть ItemsControl, который отображает Point в подходящие эллипсы, похожие на маленькие точки на двумерной карте.Как сделать этот ItemsControl в StaticResource

Поскольку мой экран содержит чертежи, где же ItemsControl должны отображаться во много раз, я попытался сделать это в StaticResource, но две вещи были неправы:

  1. Когда я пытаюсь создать экземпляр того же ресурса несколько раз , второй раз дает ошибку. Я прочитал в other answer, что это потому, что StaticResources являются, ну, статическими, и вы не можете одновременно иметь два экземпляра статического Control в визуальном дереве;

  2. Whe Я создаю экземпляр только один, привязка элемента к PainelMarc.ActualHeight (например) не работает;

Так что моя цель состоит в том, чтобы СУХОЙ мой XAML путем преобразования этого ItemsControl, или его части, в многократно используемые ресурсы.

<ItemsControl x:Name="PainelMarc" 
    ItemsSource="{Binding ExameAtivo.ListaMarcadores, Mode=TwoWay}" Grid.Row="1" Grid.RowSpan="3"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas IsItemsHost="True" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel>      
    <ItemsControl.ItemContainerStyle> 
     <Style TargetType="{x:Type FrameworkElement}"> 
      <Setter Property="RenderTransform"> 
       <Setter.Value> 
        <MultiBinding Converter="{StaticResource MarcadoresConverter}"> 
         <Binding /> 
         <Binding ElementName="PainelMarc" Path="ActualHeight"/> 
         <Binding ElementName="PainelMarc" Path="ActualWidth"/> 
         <Binding Source="{StaticResource LimitesFrontal}" Path="Geometry.Bounds"/> 
        </MultiBinding> 
       </Setter.Value> 
      </Setter>     
     </Style>     
    </ItemsControl.ItemContainerStyle> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="Double"> 
      <Canvas> 
       <Ellipse x:Name="elipsemouseover" 
        Width="10" 
        Height="{Binding Width, RelativeSource={RelativeSource Self}}" 
        Fill="White" Stroke="Black" StrokeThickness="1" RenderTransformOrigin="0.5,0.5"> 
        <Ellipse.RenderTransform> 
         <TranslateTransform X="-5" Y="-5"/> 
        </Ellipse.RenderTransform> 
       </Ellipse> 
      </Canvas> 
     </DataTemplate>    
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

ответ

1

Set x:Shared="False" на вашем ресурсе, так что поиск каждый ресурс осуществляется через StaticResource, он возвращает новый экземпляр ресурса.

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

Из MSDN звену x:Shared:

Если установлено значение ложно, модифицирует WPF ресурсов-поиска поведение так, что запросы на приписанного ресурса создать новый экземпляр для каждого запроса вместо того, чтобы делить один экземпляр для все запросы.


И второй вопрос, который ElementName связывания не работает. Это должно работать нормально, я не вижу проблемы в этом коде. Ваш конвертер должен успешно сработать.

Только в случае, если это не так, вы можете попробовать с RelativeSource вместо ElementName получить ItemsControl:

<Binding RelativeSource="{RelativeSource Mode=FindAncestor, 
          AncestorType=ItemsControl}" Path="ActualHeight"/> 
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, 
          AncestorType=ItemsControl}" Path="ActualWidth"/> 
+1

Те привязок в моем исходном коде не работал, я должен был изменить их 'RelativeSource ', и теперь все в порядке. Благодаря! – heltonbiker

+0

Great .. !! Рад, что это сработало для вас .. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^