如何替换/覆盖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>
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;
}
}