【问题标题】:How to replace / overwrite a Control in WPF如何替换/覆盖 WPF 中的控件
【发布时间】:2014-11-07 10:03:04
【问题描述】:

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

【问题讨论】:

    标签: c# wpf xaml canvas controls


    【解决方案1】:

    canvas1 只是 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 代码显示 direct 容器是 Viewbox,因此代码可以像这样简单得多:

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

    【讨论】:

    • 我该怎么做:访问旧画布的容器并用新画布替换内容。
    • @KarlW 这取决于您在此处使用的容器类型,例如:ContentControl、ItemsControl、...
    • @KarlW 实际上这里的 direct 容器是Viewbox,所以要简单得多,参见上面的第二个代码。
    猜你喜欢
    • 2011-12-26
    • 2014-03-28
    • 1970-01-01
    • 2011-02-08
    • 2011-05-14
    • 1970-01-01
    • 2013-08-20
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多