我有一个基类,包含以下内容:
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();
}
现在在运行时,如果我单击按钮,我会收到消息框,然后一旦我在消息框上单击确定没有任何反应。我调试了,并没有抛出任何异常,除了事实不起作用之外没有错误。
我做错了什么?我需要做什么才能让用户控件切换。
谢谢!
答案 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();