繁体   English   中英

解决在WPF C#中动态创建的内容

[英]Address dynamic created content in wpf c#

我正在创建用于学习目的的动态GUI。 单击“ +”按钮后,用户可以添加itemControl模板。

通过动态创建的元素的名称(在本例中为x:Name =“ lblName”应该可用,但必须首先构建)来获取元素的最佳实践是什么?

MainWindow.xaml:

    <ItemsControl Name="icDynamicTableColumn">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid Margin="0,0,0,5">
                    <StackPanel>
                        <TextBlock Text="{Binding Description}" Height="23" Width="auto" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="5"/>
                        <TextBox x:Name="lblName" Text="{Binding Textfield}" Height="23" VerticalAlignment="Top" HorizontalAlignment="Stretch" Margin="5"/>
                    </StackPanel>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
        [...]
        public ObservableCollection<DynamicTableColumn> items = new ObservableCollection<DynamicTableColumn>();
        [...]

        public MainWindow() 
        {
                [...]
                InitializeComponent();
                icDynamicTableColumn.ItemsSource = items;
        }

        public class DynamicTableColumn
        {
                public string Description
                {
                        get {
                                return _description;
                        }

                        set {
                                [...]
                        }
                }
                private string _description;
                public string Textfield { get; set; }
        }

}

如果在用户添加新项目或更改文本时足以执行某些操作,则建议使用事件,例如Loaded或TextChanged。

如果确实需要动态查找文本框,则可以使用以下代码:

    ObservableCollection<DynamicTableColumn> Collection = new ObservableCollection<DynamicTableColumn>();

    public MainWindow()
    {
        InitializeComponent();
        icDynamicTableColumn.ItemsSource = Collection;

        Loaded += MainWindow_Loaded;
    }

    private StackPanel Panel;

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        //find the panel that contains the children
        Panel = (StackPanel)VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(
                 VisualTreeHelper.GetChild(icDynamicTableColumn, 0), 0), 0);
    }

    TextBox GetTextBoxForIndex(int index)
    {
        //get the child for a given index
        var presenter = (ContentPresenter)VisualTreeHelper.GetChild(Panel, index);
        return (TextBox)presenter.ContentTemplate.FindName("lblName", presenter);
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        Collection.Add(new DynamicTableColumn());
        //make sure that the Textbox was loaded
        icDynamicTableColumn.UpdateLayout();

        var textBox = GetTextBoxForIndex(Collection.Count - 1);
    }

请注意,这假设您使用的是ItemsControl,但未更改它的(Control)Template。 如果您经常需要这样做,则可以创建自己的ItemsControl(从中派生)并公开GetTextBoxForIndex方法。 但是,您应该进行一些安全检查(例如,范围内的索引和演示者必须被加载)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM