我有一个ItemsControl
,它会将一些Point
渲染成适当定位的椭圆,类似于2D地图中的小点。
由于我的屏幕包含必须多次显示相同ItemsControl
的图形,我尝试将其设置为StaticResource,但有两件事是错误的:
当我尝试多次实例化同一资源时,第二次出错。我在other answer中读到这是因为StaticResources
是静态的,并且您不能同时在Visual Tree中有两个静态Control
实例;
当我只实例化一个时,元素绑定到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>
答案 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"/>