2010-04-08 60 views
1

有一個包含10個孩子(多邊形)的畫布元素。我的代碼中有一個從1到10的數字。如何繪製N個第一個元素?

我想根據我的編號繪製子元素的前N個元素。

這將是從XAML用最少的代碼隱藏這樣做是最好的解決辦法:

所有的孩子都添加到:

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

回答

1

爲此我通常使用表達式綁定類我編寫的名爲「EDF:可見性」,讓我做這件事:

<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; 
    } 
+0

謝謝你的詳細解答。 其實,他們均勻稀疏,並在您發佈後,我看到剪輯將足夠好(我正在尋找更優雅的解決方案)。至少,這很容易實現:) – noober 2010-04-08 13:40:09

0

我希望,我理解正確你的問題畫布將被繪製。爲了解決你的問題,你將不得不a)添加你想繪製的孩子,或者b)從Canvas類派生並重寫OnRender方法。

+0

我想看看,它是如何做到WPF風格。與綁定或觸發器的東西。 – noober 2010-04-08 12:48:29

相關問題