0

我有一个具有以下内容的基类:

public class BodyBase : UserControl
{

}

然后,我有两个 WPF 用户控件(WelcomeBody 和 SettingsBody),它们继承了该基础,例如:

public partial class WelcomeBody : BodyBase
{
    public WelcomeBody()
    {
        InitializeComponent();
    }
}

我还更改了每个 XAML 文件以反映此 BaseBody 并且在那里没有问题。设计师很好,我可以毫无问题地编辑每个控件。

我将 BodyBase 放在我的 WPF 表单上,如下所示:

 <my:BodyBase x:Name="ApplicationBody" SnapsToDevicePixels="True" Background="#FFAA1111" Panel.ZIndex="-99" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1" />

然后我点击了按钮:

private void WelcomeClick(object sender, RoutedEventArgs e)
{
    MessageBox.Show("test");
    ApplicationBody = new WelcomeBody();
}

现在在运行时,如果我单击按钮,我会得到消息框,然后一旦我在消息框上单击确定,什么都不会发生。我进行了调试,没有抛出异常,除了它不起作用之外没有任何问题。

我究竟做错了什么?我需要做什么才能让用户控制切换。

谢谢!

4

3 回答 3

1

ApplicationBody 是对“bodybase”控件的代码生成引用,该控件仅在“foo.g.cs”部分类中初始化一次。包含控件的父容器(例如 Grid)对您的“bodybase”控件有不同的引用。当您替换“ApplicationBody”引用时,Grid 仍在使用其其他引用并指向原始“bodybase”控件。这就是您看不到变化的原因。更改“ApplicationBody”后,您可以通过查看父控件的子元素来亲自看到这一点。

在 WPF 中执行此操作的正确方法是使用 ContentPresenter

于 2012-06-20T03:46:34.703 回答
0

我必须做

ApplicationBody.Content = new WelcomeBody();
于 2012-07-03T02:31:45.643 回答
0

你们都准备好按该名称分配给您的容器对象的现有控件。尝试从容器中删除控件并将新控件添加到容器中。我通常不在我的 Xaml 中分配用户控件,而是为控件添加一个容器并将我的项目换入/换出容器。

假设您的容器是一个名为 myGrid 的网格:

private void WelcomeClick(object sender, RoutedEventArgs e)
{
    MessageBox.Show("test");
    Thickness margin = ApplicationBody.Margin; //Preserve Usercontrol Location Unless it fills Container
    myGrid.Children.Remove(ApplicationBody);
    ApplicationBody = new WelcomeBody();
    ApplicationBody.Margin = margin;
    myGrid.Children.Add(ApplicationBody);
} 
于 2012-06-20T03:47:49.190 回答