在stackpanel中安排子元素

时间:2014-12-14 12:21:10

标签: c# xaml visual-studio-2012

我使用单独的类创建了一个Inkcanvas控件。我已经按照以下方式创建了stackpanel。我正在尝试按照以下方式将inkcanvas插入stackpanel。但是在窗口外面添加了inkcanvas。请找我的错误

XAML代码

<StackPanel  Name="stkm" Background="CadetBlue" HorizontalAlignment="Right" Orientation="Horizontal" Width="1140" Margin="0,107,-1,94" Grid.Column="1">
    <Grid Height="459" Name="grid2" Width="1130">

    </Grid>
</StackPanel>

我的inkcanvas类代码是

class mycan : InkCanvas
{
    string name;
    public mycan(string n)
    {
        name = n;
        this.Width =  250;
        this.Height = 200;
        // MouseDown += class1_MouseDown;
        Margin = new Thickness(5, 2, 5, 2);           

        // MouseRightButtonDown += class1_MouseRightButtonDown;     
    }
}

我以下列方式添加了stackpanel子项

public MainWindow()
{
    InitializeComponent();
    mycan mycanvas1 = new mycan("PA");
    mycan mycanvas2 = new mycan("RA");
    mycan mycanvas3 = new mycan("JA");           
    stkm.Children.Add(mycanvas1);
    stkm.Children.Add(mycanvas2);
    stkm.Children.Add(mycanvas3);
}

2 个答案:

答案 0 :(得分:0)

为什么需要动态地将InkCanvas添加到StackPanel中,有什么特别的原因吗?

更简单的方法是使用以下方法:

<StackPanel  Name="stkm" Background="CadetBlue" HorizontalAlignment="Right" Orientation="Horizontal" Width="1140" Margin="0,107,-1,94" Grid.Column="1">
   <Grid Height="459" Name="grid2" Width="1130">
      <InkCanvas Name="PA" Width="250" Height="200" Margin="5,2"/>
      <InkCanvas Name="RA" Width="250" Height="200" Margin="5,2"/>
      <InkCanvas Name="JA" Width="250" Height="200" Margin="5,2"/>
   </Grid>
</StackPanel>

或者,如果你确实需要动态生成InkCanvas,那么你真的不需要在新类中继承InkCanvas。

InkCanvas mycanvas1 = new InkCanvas()
{
   Name = "PA",
   Width = 250,
   Height = 200,
   Margin = new Thickness(5, 2, 5, 2)
};

答案 1 :(得分:0)

主要问题是你添加到XAML文件中的StackPanel的网格几乎完全填满StackPanel - StackPanel宽1140px,而Grid的宽度是1130px。

请记住,StackPanels使用相对布局,这意味着一个元素的位置取决于前一个元素的大小和位置。这意味着,在Grid之后,InkCanvas只剩下10px的StackPanel。如果您的目的是使用绝对布局,请将画布添加到Grid控件中。

我同意Mike Eason的观点。通常,最好在XAML中保留尽可能多的UI代码。您可以使用Visibility属性在运行时显示/隐藏画布。可以通过代码隐藏更改此属性,甚至可以使用数据绑定更改。

<StackPanel  Name="stkm" Background="CadetBlue" HorizontalAlignment="Right" Orientation="Horizontal" Width="1140" Margin="0,107,-1,94" Grid.Column="1">
    <InkCanvas Name="PA" Width="250" Height="250" Margin="5, 2, 5, 2" Visibility="Visible" />
    <InkCanvas Name="RA" Width="250" Height="250" Margin="5, 2, 5, 2" Visibility="Visible" />
    <InkCanvas Name="JA" Width="250" Height="250" Margin="5, 2, 5, 2" Visibility="Collapsed" />
</StackPanel>