2017-02-06 79 views
0

說我想在畫布每個按鈕爲+ 25像素低於第一計算在XAML網格/畫布的位置。通過知道哪個(在聲明的順序)子元素是

我需要得到

y-coordinate = "starting y" + (25px * self.which nth child element am I) 

這是最好的/正確的方法時,我並不想用棧板等?

爲了澄清:我試圖做到的,是對某一個元素中按鈕的所有動態計算,他們應該是相對基於第一要素位置加上其第n個元素他們自己反對第一。

如何做到這一點在XAML?

說明:知道如何真正獲得以前的兄弟姐妹的y座標或位置是我所要求的關鍵。

回答

0

使用IMultiValueConverter。

<Canvas Name="parent"> 
     <Button Name="first" Width="10" Height="10" 
       Canvas.Top="30"/> 
     <Button Width="10" Height="10"> 
      <Canvas.Top> 
       <MultiBinding Converter="{StaticResource CanvasConverter}" ConverterParameter="top"> 
        <Binding ElementName="parent"></Binding> 
        <Binding ElementName="first"></Binding> 
        <Binding RelativeSource="{RelativeSource Mode=Self}"></Binding> 
       </MultiBinding> 
      </Canvas.Top> 
     </Button> 
     <Button Width="10" Height="10"> 
      <Canvas.Top> 
       <MultiBinding Converter="{StaticResource CanvasConverter}" ConverterParameter="top"> 
        <Binding ElementName="parent"></Binding> 
        <Binding ElementName="first"></Binding> 
        <Binding RelativeSource="{RelativeSource Mode=Self}"></Binding> 
       </MultiBinding> 
      </Canvas.Top> 
     </Button> 
</Canvas> 

有:

public class CanvasConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     Canvas can = values[0] as Canvas; 
     Button btn = values[1] as Button; 
     Button btn0 = values[2] as Button; 
     if (parameter.Equals("top")) 
      return Canvas.GetTop(btn) + can.Children.IndexOf(btn0) * 25; 
     else if (parameter.Equals("left")) 
      return Canvas.GetLeft(btn) + 0; 
     return null; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

不要忘了資源的一部分:

<local:CanvasConverter x:Key="CanvasConverter" /> 
+0

即使在綁定的情況下,您是爲每個按鈕tho手動設置邊距?我試圖讓coords/position動態 – DeveloperDoge

+0

你可以使用IValueConverter嗎? – Ron

+0

是的,如果這就是你要求的框架版本不是問題。 – DeveloperDoge

0

知道如何真正得到前一個同級的y座標或位置是非常關鍵我所問的。

Canvas面板上有一個Children收集其子UIElements的。您可以使用IndexOf方法獲取此集合中特定元素的位置。

獲取和設置此元素的座標就是調用Canvas.Get*Canvas.Set*方法的問題。

下面的示例代碼應該給你的想法:

Button button = new Button { Content = "..." }; 
canvas.Children.Add(button); 

int buttonIndex = canvas.Children.IndexOf(button); 
int previousElementIndex = buttonIndex - 1; 
if(previousElementIndex > -1) 
{ 
    //get the coordinates of the previous element 
    UIElement previousElement = canvas.Children[previousElementIndex]; 
    double x = Canvas.GetLeft(previousElement); 
    double y = Canvas.GetTop(previousElement); 

    //set the coordinates of the button 
    Canvas.SetTop(button, y + 25); 
    Canvas.SetLeft(button, x + 25); 
} 

如何在XAML中做到這一點?

XAML是標記語言。您可以在編程語言(如C#)中實現您的邏輯。