WPF用户控件不变

时间:2012-06-20 03:20:59

标签: wpf xaml c#-4.0 inheritance user-controls

我有一个基类,包含以下内容:

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();
}

现在在运行时,如果我单击按钮,我会收到消息框,然后一旦我在消息框上单击确定没有任何反应。我调试了,并没有抛出任何异常,除了事实不起作用之外没有错误。

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

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您已准备好通过分配给容器对象的名称来控制现有控件。尝试从Container中删除Control并将新的一个添加到Container。我通常不会在我的Xaml中分配Usercontrol,我为Controls添加一个容器并将我的项目交换进Container中。

假设您的容器是名为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);
} 

答案 2 :(得分:0)

我不得不做

ApplicationBody.Content = new WelcomeBody();