WPF中如何实现两个UserControl之间的联动跳转与正确显示
问题根因
你虽然创建了AddNewTruckUC的实例,但是没有将这个实例添加到主窗口的StackPanelMain容器的子元素集合中,控件不在界面的可视化树中,哪怕设置Visibility为可见也不会渲染显示。
修复方案
方式1:直接在按钮点击事件中操作主窗口容器
首先需要在携带按钮的UserControl里拿到主窗口的StackPanelMain实例,再将新的UserControl加入容器,修改后代码如下:
private void Button_Click(object sender, RoutedEventArgs e) { // 获取当前主窗口实例,将「你的主窗口类名」替换为你实际的主窗口类名 var mainWindow = Window.GetWindow(this) as 你的主窗口类名; if(mainWindow == null) return; AddNewTruckUC addNewTruckUC = new AddNewTruckUC(); // 先清空容器里的现有内容 mainWindow.StackPanelMain.Children.Clear(); // 把新的UserControl加入到容器中,默认加入的控件即为可见状态 mainWindow.StackPanelMain.Children.Add(addNewTruckUC); this.Visibility = Visibility.Hidden; }
注意:需要先把主窗口里StackPanelMain的x:FieldModifier属性设置为public或者internal,否则UserControl没有权限访问该控件,修改后的XAML如下:
<StackPanel x:Name="StackPanelMain" x:FieldModifier="public" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch"/>
方式2:事件通知主窗口切换(耦合度更低的推荐写法)
避免UserControl直接操作主窗口控件,降低代码耦合,修改逻辑如下:
- 先在带按钮的UserControl中定义切换页面的事件
public event EventHandler SwitchToAddTruckPage; private void Button_Click(object sender, RoutedEventArgs e) { SwitchToAddTruckPage?.Invoke(this, EventArgs.Empty); this.Visibility = Visibility.Hidden; }
- 在主窗口初始化按钮UserControl时订阅该事件
// 主窗口中初始化按钮UserControl的逻辑 var buttonUC = new 你的按钮UserControl类名(); buttonUC.SwitchToAddTruckPage += ButtonUC_SwitchToAddTruckPage; StackPanelMain.Children.Add(buttonUC); // 事件处理方法 private void ButtonUC_SwitchToAddTruckPage(object sender, EventArgs e) { StackPanelMain.Children.Clear(); StackPanelMain.Children.Add(new AddNewTruckUC()); }
内容的提问来源于stack exchange,提问作者BoogieMan
相关产品推荐
相关产品推荐

