繁体   English   中英

WPF项目控制网格

[英]WPF item control grid

我正在尝试使网格将包含一些按钮(1、4、8)。

<Window x:Class="WpfApplication9.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid >
    <Grid.RowDefinitions>
        <RowDefinition Height="20"></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
    </Grid.ColumnDefinitions>
    <!--<Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Button Grid.Row="0" Grid.Column="0"></Button>
        <Button Grid.Row="0" Grid.Column="1"></Button>
        <Button Grid.Row="1" Grid.Column="0"></Button>
        <Button Grid.Row="1" Grid.Column="1"></Button>
    </Grid>-->
    <ItemsControl ItemsSource="{Binding TheList}" x:Name="MyGrid" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="Auto" Grid.Row="1">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
    <StackPanel Orientation="Horizontal">
        <Button Command="{Binding One}">1</Button>
        <Button Command="{Binding Four}">4</Button>
        <Button Command="{Binding Eight}">8</Button>
    </StackPanel>
</Grid>

码:

using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Collections.ObjectModel;
namespace WpfApplication9
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
/// 

public partial class MainWindow : Window
{
    public class ViewModelTest : INotifyPropertyChanged
    {
        private ObservableCollection<Button> theList;
        public ObservableCollection<Button> TheList
        {
            get { return theList; }
            set { theList = value; NotifyPropertyChanged("TheList"); }
        }
        public ViewModelTest()
        {
            One = new RelayCommand(() => OneButton());
            Four = new RelayCommand(() => FourButton());
            Eight = new RelayCommand(() => EightButton());



            //TheList.Clear();
            //for (int i = 0; i < 4; i++)
            //{
            //    System.Windows.Controls.Button newBtn = new Button();
            //    newBtn.Content = i.ToString();
            //    newBtn.Name = "Button" + i.ToString();
            //    TheList.Add(newBtn);
            //}
        }
        public ICommand One { get; set; }
        public ICommand Four { get; set; }
        public ICommand Eight { get; set; }


        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
        public void OneButton()
        {
            TheList = new ObservableCollection<Button>();                
            for (int i = 0; i < 1; i++)
            {
                Button btn = new Button();
                System.Windows.Controls.Button newBtn = new Button();
                newBtn.Content = i.ToString();
                newBtn.Name = "Button" + i.ToString();
                TheList.Add(newBtn);
            }
        }
        public void FourButton()
        {
            TheList = new ObservableCollection<Button>();
            for (int i = 0; i < 4; i++)
            {
                Button btn = new Button();
                System.Windows.Controls.Button newBtn = new Button();
                newBtn.Content = i.ToString();
                newBtn.Name = "Button" + i.ToString();
                TheList.Add(newBtn);
            }

            //MyGrid.Children.Clear();
            //MyGrid.ColumnDefinitions.Clear();
            //MyGrid.RowDefinitions.Clear();
            //MyGrid.ColumnDefinitions.Add(new ColumnDefinition());
            //MyGrid.ColumnDefinitions.Add(new ColumnDefinition());
            //MyGrid.RowDefinitions.Add(new RowDefinition());
            //MyGrid.RowDefinitions.Add(new RowDefinition());
            //for (int row =0;row<MyGrid.ColumnDefinitions.Count;row++)
            //{
            //    for (int column=0;column<MyGrid.ColumnDefinitions.Count;column++)
            //    {
            //            System.Windows.Controls.Button newBtn = new Button();
            //            newBtn.Content = row.ToString() + column.ToString();
            //            newBtn.Name = "Button" + row.ToString()+column.ToString();
            //            newBtn.SetValue(Grid.ColumnProperty,column);
            //            newBtn.SetValue(Grid.RowProperty, row);
            //            MyGrid.Children.Add(newBtn);
            //    }
            //}
        }
        public void EightButton()
        {
            TheList = new ObservableCollection<Button>();
            for (int i = 0; i < 8; i++)
            {
                Button btn = new Button();
                System.Windows.Controls.Button newBtn = new Button();
                newBtn.Content = i.ToString();
                newBtn.Name = "Button" + i.ToString();
                TheList.Add(newBtn);
            }
            //MyGrid.Children.Clear();
            //MyGrid.ColumnDefinitions.Clear();
            //MyGrid.RowDefinitions.Clear();
            //MyGrid.ColumnDefinitions.Add(new ColumnDefinition());
            //MyGrid.ColumnDefinitions.Add(new ColumnDefinition());
            //MyGrid.ColumnDefinitions.Add(new ColumnDefinition());
            //MyGrid.ColumnDefinitions.Add(new ColumnDefinition());
            //MyGrid.RowDefinitions.Add(new RowDefinition());
            //MyGrid.RowDefinitions.Add(new RowDefinition());
            //for (int row = 0; row < MyGrid.ColumnDefinitions.Count; row++)
            //{
            //    for (int column = 0; column < MyGrid.ColumnDefinitions.Count; column++)
            //    {
            //        System.Windows.Controls.Button newBtn = new Button();
            //        newBtn.Content = row.ToString() + column.ToString();
            //        newBtn.Name = "Button" + row.ToString() + column.ToString();
            //        newBtn.SetValue(Grid.ColumnProperty, column);
            //        newBtn.SetValue(Grid.RowProperty, row);
            //        MyGrid.Children.Add(newBtn);
            //    }
            //}
        }
    }
    public MainWindow()
    {

        DataContext = new ViewModelTest();
        InitializeComponent();

    }
}

但是我在显示上有问题。 在这种情况下,如何动态地在itemcontrol中创建新的列和行。

好,从哪里开始...
您在这里遇到了几个问题。

  1. TheList是一个ObservableCollection,因此不需要在TheList属性中使用'NotifyPropertyChanged'。 并且不需要theList成员变量。 只需将以下内容用于您的媒体资源:

    公共ObservableCollection TheList {get; 组; }

  2. 但是,在后面的代码中,直到单击您的按钮之一,才会初始化“ TheList”。 因此,您的XAML绑定到空对象,因此几乎不绑定任何东西,无论您在绑定后将“ TheList”更改为什么,您仍然绑定为null。 若要解决此问题,请确保在调用InitializeComponents()之前在构造函数中初始化TheList。 将构造函数更改为以下内容:

    public MainWindow() { TheList = new ObservableCollection<Button>(); DataContext = new ViewModelTest(); InitializeComponent(); }

同样,您在所有设置TheList = new ObservableCollection<Button>()地方都将指针更改为其他指针,因此绑定再次被破坏。 无需重新初始化TheList,只需执行TheList.Clear(); 然后使用TheList.Add(newBtn);将按钮添加到TheList TheList.Add(newBtn);

  1. 因此,看起来您有一堆没有高度的RowDefinitions,我想这些只是占位符? 您可以将Grid x:Name="MyInternalGrid" ,然后将其添加到TheList ,将行添加到TheList执行相同的MyInternalGrid 所以当调用TheList.Clear(); 也可以通过调用MyInternalGrid.RowDefinitions.Clear();清除gridRows MyInternalGrid.RowDefinitions.Clear(); 然后,无论何时调用TheList.Add(newBtn); ,使用MyInternalGrid.RowDefinitions.Add(new RowDefinition{Height=20});将另一行添加到网格中MyInternalGrid.RowDefinitions.Add(new RowDefinition{Height=20}); 当您这样做时,请确保将正确的行分配给您的newBtn。 Grid.SetRow(newBtn, MyInternalGrid.RowDefinitions.Count); 在将newBtn添加到newBtn TheList 这就是我的意思,更改您的方法以模仿以下重构的EightButton()方法:

    public void EightButton() { TheList.Clear(); MyInternalGrid.RowDefinitions.Clear(); for (int i = 0; i < 8; i++) { Button newBtn = new Button(); newBtn.Content = i.ToString(); newBtn.Name = "Button" + i.ToString(); Grid.SetRow(newBtn, MyInternalGrid.RowDefinitions.Count);
    MyInternalGrid.RowDefinitions.Add(new RowDefinition{Height=20}); TheList.Add(newBtn); } }

或者,您可能只是不想担心所有网格行,并将<StackPanel>放在<Grid>然后将所有按钮动态添加到该<StackPanel> 只需先清除堆栈面板, MyStackPanel.Children.Clear(); 然后在循环中添加像MyStackPanel.Children.Add(newBtn);这样的新按钮MyStackPanel.Children.Add(newBtn);

家中的一些帮助。

暂无
暂无

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

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