我目前正在开发我的第一个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>
答案 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;
}
}