2016-06-20 2 views
0

ich einen relativ unique WPF Application in C# entwickle, und ich muss programmatisch my Buttons (Benutzer können Schaltflächen hinzufügen und entfernen) anordnen in einer Banane wie Kurve neben meinem Taste wie folgt aus:WPF Banana-Like Kurve Anordnung für Knöpfe

Picture

ich versuchte es mit einem StackPanel, aber es ist immer in einer rechteckigen Form, und ich weiß nicht, wie der Algorithmus diesen zum dynamischen Hinzufügen von Schaltflächen mit benutzerdefinierten Größen zu schreiben.

tl; dr: Kann mir jemand helfen, den Algorithmus zu finden, um dynamisch Buttons in einer bananenartigen Kurve anzuordnen?

Danke!

+0

Haben Sie sie programmatisch zeichnen möchten, oder sind sie bereits festgelegt und nur der Stil ändern müssen? –

+0

Machen Sie Ihr eigenes Panel und überschreiben Sie ArrangeOverride und MeasureOverride, um die Kinder an die gewünschten Stellen zu bringen. Verwenden Sie eine Exponentialfunktion, um Elemente an die gewünschte Stelle zu setzen – nkoniishvt

+0

@NawedNabiZada Der Benutzer zieht Dateien auf sie, und ich bekomme die Bitmap aus der Datei. Also ich habe eine Bitmap. –

Antwort

0

ich maßgeschneiderte es für Ihre Bedürfnisse.

Alles, was Sie brauchen, ist eine Leinwand (sc in meinem Fall)

private void calcPos(double radius) { int l = sc.Children.Count; double x, y; double radians = 90/(l); double alpha = 0.0; int current = 1; foreach(Image i in sc.Children) { alpha = 90 - (radians * current); y = radius * Math.Sin((Math.PI/180) * alpha); x = radius * Math.Cos((Math.PI/180) * alpha); x = 300 - x; //Window Size y = 300 - y; //Window Size i.Margin = new Thickness(x,y,0,0); current++; } }

2

Stellen Sie Ihr eigenes Panel her und verwenden Sie eine Exponentialfunktion, um Elemente dorthin zu bringen, wo Sie sie haben möchten. So etwas wie diese (habe es nicht versuchen):

public class BananaPanel : Panel { 

    protected override Size MeasureOverride(Size availableSize) { 
     double totalX, totalY; 

     foreach (UIElement element in Children) { 
      element.Measure(availableSize); 
      totalX += element.DesiredSize.Width; 
      totalY += element.DesiredSize.Height; 
     } 
     return new Size(totalX, totalY); 
    } 

    protected override Size ArrangeOverride(Size finalSize) { 
     if(InternalChildren.Count == 0) return finalSize; 
     double maxValue = Math.Abs(InternalChildren.Count, 2); 
     double ratioX = finalSize.Width/maxValue; 
     double ratioY = finalSize.Height/maxValue; 
     for(int i=0; i<InternalChildren.Count; i++) { 
      UIElement element = InternalChildren[i]; 

      Point p = new Point(Math.Pow(i, 2)*ratioX, Math.Pow(i, 2)*ratioY); //using square here, so it won't be banana-like, use an exponential function 

      element.Arrange(new Rect(p, element.DesiredSize)); 
     } 

     return finalSize; 
    } 
} 

In XAML:

<ItemsControl ItemsSource="{Binding YourBananaItems, Mode=OneWay}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <local:BananaPanel/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl>