如何替换/覆盖WPF中的控件

本文关键字:WPF 覆盖 控件 何替换 替换 | 更新日期: 2023-09-27 18:29:28

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

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

在运行时,我使用函数"GenTechnicalDrawing()"动态创建一个新画布(有很多子对象)。

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

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

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

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

谢谢Karl

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>

如何替换/覆盖WPF中的控件

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代码显示直接

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