2014-02-18 40 views
0

我有一個ItemsControl,它將一些Point渲染爲類似於2D地圖中的小點的恰當定位的橢圓。如何將此ItemsControl設置爲StaticResource

因爲我的屏幕包含圖形,其中相同ItemsControl必須顯示很多次,我試着將它做成靜態資源,但兩件事情是錯誤的:

  1. 當我嘗試在同一資源多次實例,第二次發生錯誤。我在other answer中讀到這是因爲StaticResources是靜態的,並且在Visual Tree中同時不能有兩個靜態的Control實例;

  2. 當我只實例化一個,元素綁定到PainelMarc.ActualHeight(例如)不起作用;

所以我的目標是將這個ItemsControl,或它的一部分,爲可重複使用的資源枯竭我的XAML。

<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

x:Shared="False"你的資源,這樣每次資源查找是通過StaticResource的完成,它返回資源的新實例。

所有資源的缺省值爲true。因此,您在不同的視覺樹中添加相同控件時會出現錯誤。

x:Shared MSDN鏈接:

設置爲false時,會修改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

很棒.. !!很高興它爲你工作.. :) –