有一个包含10个子元素(多边形)的canvas元素。我的代码中有一个数字,从1到10。
我想根据我的号码从子元素中绘制前N个元素。
最好的解决方案是从XAML执行此操作,并使用最少的代码隐藏:
...
MyCanvas.N = 5;
...
答案 0 :(得分:1)
为此,我通常使用一个名为“edf:Visibility”的表达式绑定类,它允许我这样做:
<ItemsControl ItemsSource="{Binding Polygons}" AlternationCount="1000000">
<ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsPanel>
<ItemContainerStyle>
<Style>
<Setter Property="Visibility"
Value="{edf:Visibility self.AlternationIndex < context.N}" />
</Style>
</ItemContainerStyle>
</ItemsControl>
使用标准绑定和转换器可以完成同样的事情:
...
<Setter Property="Visibility"
Value="{Binding RelativeSource={RelativeSource Self},
Converter={x:Static AlternationIndexComparer.Instance}}" />
...
当然在这种情况下你必须自己编写转换器。
如果您的多边形都是固定的宽度或高度并且间距均匀,则无需代码即可轻松实现此方法,即使用剪裁几何体并将其宽度(或高度)转换为N因子,以使其仅显示N个多边形。剪裁几何体的XAML具有如下变换:
<PathGeometry>
<PathGeometry.Transform>
<ScaleTransform ScaleX="{Binding N}" />
</PathGeometry.Transform>
...
</PathGeometry>
根据您对问题的描述,这似乎不适用于您的情况。
一般的解决方案是使用此功能创建附加属性,可以像这样使用:
<Canvas local:MyAttachedProperties.ChildrenVisible="{Binding N}">
...
</Canvas>
在这种情况下,您必须创建ChildrenVisible属性,但您只需对其进行一次编码,它将适用于任何面板(不仅仅是画布)。这是详细的技术:
public class MyAttachedProperties
{
... GetChildrenVisible ... // use propa snippet to implement attached property
... SetChildrenVisible ...
... RegisterAttached("ChildrenVisible", typeof(int), typeof(MyAttachedProperties), new PropertyMetadata
{
DefaultValue = int.MaxValue,
PropertyChangedCallback = (obj, e) =>
{
UpdateVisibility((Panel)obj);
if(((int)e.OldValue)==int.MaxValue)
((UIElement)obj).LayoutUpdated += (obj2, e2) => UpdateVisibility((Panel)obj2);
}
});
static void UpdateVisibility(Panel panel)
{
int n = GetChildrenVisible(panel);
int i = 0;
foreach(var child in panel.Children)
child.Visibility = (i++ < n) ? Visibility.Visible : Visibility.Collapsed;
}
答案 1 :(得分:0)
我希望,我理解你的问题:
您将添加到画布中的所有孩子。要解决您的问题,您必须a)仅添加您想要绘制的子项,或b)从Canvas类派生并覆盖OnRender方法。