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

标签 c# .net wpf

<分区>

我的 WPF 应用程序界面需要一些非常不同的东西。实际上我的应用程序中有动态按钮。现在我希望当我点击按钮时它的面板应该创建并打开以在它的文本框中添加一些东西以保存在数据库中!以同样的方式,Format TextBox 应该随着打开的 Panels 更新,如下图所示。

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

enter image description here

编辑:

我没有使用 MVVM!

最佳答案

我希望您只是在寻求解决问题的一般方法,因为我懒得编写所有这些东西。
所以这里是:

  1. 为您的面板创建一个用户控件。由于它们都相同,因此使用一个属性来存储为哪个按钮创建面板的值。
  2. 为您的面板控件创建一个 ObservableCollection,您将在此处存储新添加的面板。
  3. 创建一个 ItemsControl 来显示您的面板,并将您的 ObservableCollection 指定为该面板的 ItemsSource。这样,如果您向集合中添加一些内容,它将显示在您的 GUI 上
  4. 将一个事件附加到您的按钮,在这种情况下您将(实例化一个新面板)->(将面板的 ID 设置为“button1”、“button2”、“button3”或您想要区分的任何方式)-> (将面板添加到 ObservableCollection)
  5. 当您完成并想要获取所有面板等时,您可以简单地遍历 ObservableCollection 并在其中选择面板/值。您还可以使用 linq 按按钮 ID 等过滤面板。

还有什么问题,尽管问:)

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

--编辑--
这是一个链接 my struggles with ObservableCollection .在那里,您可以找到一种快速简单的方法来将集合附加到列表并处理更改。
Microsoft tutorial在 INotifyPropertyChanged 上,您将在面板中实现该接口(interface)(可能)
Microsoft tutorial关于 ObservableCollections。
Microsoft tutorial关于如何将数据绑定(bind)到列表等
现在记住:他们在教程中使用简单的对象,但您可以以相同的方式使用用户控件。
同样,阅读量很大,但你必须自己动手......祝你好运 :)

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

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 ObservableCollection<MyPanel> panels = new ObservableCollection<MyPanel>();

然后在构造函数中将其附加到您的 ItemControl:

lstPanels.ItemsSource = panels;

然后添加添加新面板的函数:

private void addPanel(string buttonId)
{
    MyPanel p = new MyPanel { Id = buttonId; };
    panels.add(p);
}

然后在您的 button1/button2/button3 上单击并使用适当的 id 调用该函数:

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

当你想完成并循环遍历面板时,在 panels 上使用标准的 foreach 或 for 循环 :)

关于c# - 如何在单击按钮时创建新面板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19118681/

相关文章:

c# - 如果有镜面激光忽略其他物体

c# - 如何将一个对象转换为另一个对象?

c# - WPF InkCanvas : Draw line with DynamicRenderer

c# - 如何确定 Assembly.Load() 在何处搜索程序集?

c# - 为什么我的 WPF ListView/GridView 没有虚拟化?

c# - 创建新的 Thread() 要求 ParameterizedThreadStart 对象作为 C sharp 中的参数

c# - 有任何用户友好的 C# .NET 引用指南吗?

c# - .Net 到 SQL,比较唯一值的最佳方式

c# - 非 WPF 应用程序中的隐式 WPF 样式

c# - WPF 浏览器调用脚本