如何绘制N个第一个元素?

时间:2010-04-08 12:33:45

标签: wpf

有一个包含10个子元素(多边形)的canvas元素。我的代码中有一个数字,从1到10。

我想根据我的号码从子元素中绘制前N个元素。

最好的解决方案是从XAML执行此操作,并使用最少的代码隐藏:

...
MyCanvas.N = 5;
...

2 个答案:

答案 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 &lt; 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方法。