C# 如何在单击按钮时创建新面板?

C# 如何在单击按钮时创建新面板?,c#,.net,wpf,C#,.net,Wpf,我的WPF应用程序接口需要一些真正不同的东西。实际上,我的应用程序中有动态按钮。现在我想,当我点击按钮,它的面板应该创建并打开,以添加一些东西在它的文本框保存在数据库中!同样的,Format TextBox应该随着打开的面板更新,因为下面的这张图片显示了你们所有人 如何区分面板和文本框以将文本保存在数据库中的文本框中? 编辑: 我没有使用MVVM 我希望您只是要求提供解决该问题的一般方法,因为我不想费心编写所有这些东西。 下面是: 为面板创建用户控件。因为它们都是相同的,所以使用属性来存储为哪

我的WPF应用程序接口需要一些真正不同的东西。实际上,我的应用程序中有动态按钮。现在我想,当我点击按钮,它的面板应该创建并打开,以添加一些东西在它的文本框保存在数据库中!同样的,Format TextBox应该随着打开的面板更新,因为下面的这张图片显示了你们所有人

如何区分面板和文本框以将文本保存在数据库中的文本框中?

编辑:


我没有使用MVVM

我希望您只是要求提供解决该问题的一般方法,因为我不想费心编写所有这些东西。
下面是:

  • 为面板创建用户控件。因为它们都是相同的,所以使用属性来存储为哪个按钮创建面板的值
  • 创建一个可观察的面板控件集合,您将在此处存储新添加的面板
  • 创建ItemsControl以显示面板,并将ObservableCollection指定为该面板的ItemsSource。这样,如果您向集合中添加了一些内容,它将显示在您的GUI上
  • 将事件附加到按钮,在此事件中,您将(实例化一个新面板)->(将面板ID设置为“button1”、“button2”、“button3”或您想要区分的方式)->(将面板添加到ObservableCollection)
  • 当您完成并想要获取所有面板等时,您只需在ObservableCollection中循环并在那里选择pannels/values。您还可以使用linq按按钮ID等过滤面板
  • 还有什么问题,就问:)

    --编辑--
    1.正如我所说,创建一个用户控件,它将成为您的面板。通过这种方式,您可以在按钮单击事件的代码(xaml.cs文件)中实例化它,就像实例化任何其他类的对象一样。
    2.当您创建面板用户控件时,让我们将其称为
    MyPanel
    ,在代码后面添加一个属性,并可以随意调用它(
    ParentButton
    )。现在,您可以添加一个将按钮ID作为参数的构造函数,或者只需使用标准构造函数,然后在将面板添加到集合之前将按钮ID分配给该属性

    --编辑--
    这里是一个链接。在那里,您可以找到一种快速简单的方法,将集合附加到列表并处理更改。
    在INotifyPropertyChanged上,您将在面板中实现该接口(可能)
    关于可观察到的集合。
    关于如何将数据绑定到列表等
    现在请记住:他们在教程中使用简单对象,但您也可以以同样的方式使用用户控件。
    再说一次,这是很多阅读,但你必须自己做。。。祝你好运:)

    --编辑--
    实际上,您甚至不必创建用户控件,只需创建一个包含您想要保存的数据的对象,如下所示:

    class MyPanel: INotifyPropertyChanged
    {
        private string _id;
        private string _text;
    
        public string Id
        {
            get { return _id; }
            set
            {
                if (value != _id)
                {
                    _id = value;
                    NotifyPropertyChanged();
                }
            }
        }
        public string Text
        {
            get { return _text; }
            set
            {
                if (value != _text)
                {
                    _text= value;
                    NotifyPropertyChanged();
                }
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    然后在应用程序窗口中添加一个控件,您希望在其中显示面板:

    <ItemsControl Name="lstPanels" ScrollViewer.VerticalScrollBarVisibility="Auto">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel orientation="vertical">
                            <TextBlock Text="{Binding Id}">
                            <TextBox Text="{Binding Text, Mode=TwoWay}" />
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
    
    然后添加一个函数以添加新面板:

    private void addPanel(string buttonId)
    {
        MyPanel p = new MyPanel { Id = buttonId; };
        panels.add(p);
    }
    
    然后在按钮1/button2/button3上单击使用适当id调用该函数:

    addPanel("button1");
    addPanel("button2");
    

    当您要完成并循环面板时,请使用标准foreach或在
    面板上进行循环(
    :)

    @DaveRook是否要上载另一个以使文本可见?@DaveRook请立即检查:)这是WPF。我没有选择WinForm我没有使用MVVM…为什么?我没有使用MVVM就制作了一个非常简单的应用程序。很少有部分正在进行中。所以现在很难转到MVVM@Shoe:)谢谢!:)是的,我还有两个问题
    如何通过编程或设计生成面板
    其次
    如何为面板分配ID
    ?:)好的,我的理解是:
    我创建了一个包含面板布局的UserControl。现在,当我点击按钮时,它的EventHandler将把它的id传递给ObservableCollection,并在其中添加具有相同id的面板。
    我说得对吗,先生?谢谢你让我开始这个,如果我有,我可以在评论中发布查询吗?检查我为你发布的代码示例…哦,谢谢,太多了:)。。。保持幸福:)
    private void addPanel(string buttonId)
    {
        MyPanel p = new MyPanel { Id = buttonId; };
        panels.add(p);
    }
    
    addPanel("button1");
    addPanel("button2");