如何将这个ItemsControl转换为StaticResource

时间:2014-02-18 19:49:15

标签: wpf xaml staticresource

我有一个ItemsControl,它会将一些Point渲染成适当定位的椭圆,类似于2D地图中的小点。

由于我的屏幕包含必须多次显示相同ItemsControl的图形,我尝试将其设置为StaticResource,但有两件事是错误的:

  1. 当我尝试多次实例化同一资源时,第二次出错。我在other answer中读到这是因为StaticResources是静态的,并且您不能同时在Visual Tree中有两个静态Control实例;

  2. 当我只实例化一个时,元素绑定到PainelMarc.ActualHeight(例如)不起作用;

  3. 所以我的目标是通过将此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 个答案:

答案 0 :(得分: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"/>