如何在WPF中替换/覆盖Control

时间:2014-11-07 10:03:04

标签: c# wpf xaml canvas controls

我目前正在开发我的第一个WPF应用程序。

我在“Designer”中创建了一个名为“canvas1”的空白画布控件。

在运行时,我正在使用我的函数“GenTechnicalDrawing()”动态创建一个新画布(有很多子画面)。

我想我可以用另一个画布替换画布,但这似乎不起作用。

private void Button_Click(object sender, RoutedEventArgs e)
{            
    Canvas complicatedCanvas = GenTechnicalDrawing();
    canvas1 = complicatedCanvas;
}  

它不会抛出错误,但也不会改变显示。

解决这个问题的最佳方法是什么?

由于 卡尔

PS:我的XAML

<Grid Name="myGrid" RenderTransformOrigin="0.5,0.492">
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>            
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <Viewbox Grid.Row="1" Grid.Column="1">
        <Canvas Name="canvas1"  Width="100" Height="50" Background="Green"/>
    </Viewbox>

    <Button Content="Button" Grid.Row="2" Grid.Column="2" Click="Button_Click"/>
    <Button Content="clear" Grid.Row="1" Grid.Column="2" Click="Button_Click_1"/>

</Grid>

1 个答案:

答案 0 :(得分:0)

canvas1只是Window类中的一个字段。所以你正在做的事实上是将它指向另一个画布实例,而旧画布仍然由某个元素的某些其他属性(例如由Window的Content属性持有)保持。要更改内容,您必须访问旧画布的容器并使用新画布替换内容。

例如:如果您使用Grid作为容器,请尝试以下代码:

private void Button_Click(object sender, RoutedEventArgs e)
{            
    Canvas complicatedCanvas = GenTechnicalDrawing();
    var grid = canvas1.Parent as Grid;
    if(grid != null){
       var column = Grid.GetColumn(canvas1);
       var row = Grid.GetRow(canvas1);
       var colSpan = Grid.GetColumnSpan(canvas1);
       var rowSpan = Grid.GetRowSpan(canvas1);
       grid.Children.Remove(canvas1); //remove old canvas
       grid.Children.Add(complicatedCanvas);//add new canvas
       Grid.SetColumn(complicatedCanvas, column);
       Grid.SetRow(complicatedCanvas, row);
       Grid.SetColumnSpan(complicatedCanvas, colSpan);
       Gid.SetRowSpan(complicatedCanvas, rowSpan);
    }
}

但是,您更新的XAML代码显示此处的 直接 容器为Viewbox,因此代码可以更加简单:

private void Button_Click(object sender, RoutedEventArgs e)
{            
    Canvas complicatedCanvas = GenTechnicalDrawing();
    var vb = canvas1.Parent as Viewbox;
    if(vb != null){
       vb.Child = complicatedCanvas;
    }
}