使用子用户控件按钮从窗口加载另一个子用户控件到网格中

Posted

技术标签:

【中文标题】使用子用户控件按钮从窗口加载另一个子用户控件到网格中【英文标题】:use a child usercontrol button to load another child usercontrol in a grid from a window 【发布时间】:2021-05-12 11:21:37 【问题描述】:

我正在创建一个 wpf 应用程序,在该应用程序中有一个带有网格的窗口,在这个网格中我通过将用户控件添加到网格来托管我的用户控件,

我必须详细解释这一点以表明它有效

so basically there is a side menu, which In actuality is a listview, and when a listview item is selected or that event is raised, the corresponding user control to that listview item is added to the grid

这行得通,但这很慢,所以我所做的是将所有用户控件加载到网格中并控制与所选列表视图项相对应的用户控件的可见性属性

这是我正在使用的代码

 //Adds usercontrol to grid

 private void Window_Loaded(object sender, RoutedEventArgs e)
    
        UserControl usc = null;

        usc = new Home();
        usc.Tag = "Home";
        LoadGrid.Children.Add(usc)
    
        ShowUserControl("Home");
     


  //controls UserControl visibility

  private void ShowUserContro(string v)

    
        foreach (UIElement item in LoadGrid.Children)
        
            if (item is UserControl) 
            
                UserControl x = (UserControl)item;
                if (x.Tag != null) 
                
                    if (x.Tag.ToString().ToUpper() == v.ToUpper())
                    
                        x.Visibility = Visibility.Visible;
                    
                    else 
                    
                        x.Visibility = Visibility.Collapsed;
                    
                
            
        
    



    //controls listview selection changed event

        private void ListViewMenu_SelectionChanged(object sender, SelectionChangedEventArgs e)
    
        ShowUserContro((((ListViewItem)((ListView)sender).SelectedItem).Name));
    

我的问题是我希望网格承载用户控件,但它应该绑定到用户控件内的按钮

例子:

(网格存在的主窗口,子窗口被添加到网格中,其可见性属性是折叠和可见的,此事件与列表视图菜单相关联)

当我们说一个名为 home 的列表视图项被选中时,对应于 home 的用户控件被添加并可见,这有一个按钮应该显示另一个用户控件 (即托管一些文本框和数据网格)

【问题讨论】:

【参考方案1】:
    您可以将主窗口作为输入参数发送到 用户控制器构造函数并在主窗口中放置方法 添加用户控制器和添加或管理用户控制器 在那里。 下一个解决方案是为 当前控制并在主窗口中使用该事件,当然还有 这种方法更好。

MainWindow.cs

public MainWindow()

   InitializeComponent();
   MyUserControl myControl = new MyUserControl();
   myControl.ButtonClicked += MyControl_ButtonClicked;
   this.stMain.Children.Add(myControl);


private void MyControl_ButtonClicked(object Sender)

    //add userControl
    MessageBox.Show("Test");

MyUserControl.Xaml

<UserControl x:Class="TestProj.MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:TestProj"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Button x:Name="btnAddOtheruserControl" Click="btnAddOtheruserControl_Click" Content="add Another UserControl">         </Button>
    </Grid>
</UserControl>

MyUserControl.cs

 public partial class MyUserControl : UserControl

    public event EventAddAnotherUserControl ButtonClicked;
    public delegate void EventAddAnotherUserControl(object Sender);
    public MyUserControl()
    
       InitializeComponent();
    

    private void btnAddOtheruserControl_Click(object sender, RoutedEventArgs e)
    
       if (ButtonClicked != null)
           ButtonClicked(btnAddOtheruserControl);
    

【讨论】:

以上是关于使用子用户控件按钮从窗口加载另一个子用户控件到网格中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 webbrowser WPF 顶部打开用户控件作为弹出窗口

当从一个子调用但另一个子调用时添加控件的子工作

将用户控件添加到网格异步[重复]

如何从后面的用户控件代码访问用户控件所在的主窗口上的网格列

将数据加载到数据网格时 C#/WPF 主窗口冻结

在 WPF 的网格中显示对其他控件的控件