Как избежать нежелательных строк пустых пространств поверх пользовательского элемента управления состоит из 2D кнопок и меток C # WPF - PullRequest
0 голосов
/ 13 февраля 2019

В течение последних 3 недель я изо всех сил пытался отобразить массив элементов управления, каждый элемент управления которого в основном состоял из 17 кнопок и 2 меток.Текущий размер массива 200 предназначен только для тестирования.В конечном итоге этот фрагмент кода будет иметь программируемый номер массива.200 также является хорошим размером для демонстрации функции просмотра прокрутки.Ожидалось, что он будет отображаться следующим образом: Желаемый вывод .Следующий фактический вывод Нежелательные пробелы сверху , имеют нежелательные строки пробелов, которые требуют от меня прокрутки вниз, чтобы увидеть начало первого элемента набора кнопок и меток.Прилагаются коды для вашего любезного внимания.Я программирую на C # на WPF уже 9 месяцев.Я программировал на VB в течение многих лет, это мой первый вклад в этот форум после того, как я стал его пользователем.Заранее благодарю за любую помощь.

<Window x:Class="Test_Array_Controls_2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Test_Array_Controls_2"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="100"></RowDefinition>
    </Grid.RowDefinitions>
    <ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" VerticalAlignment="Top" Height="auto" Background="AliceBlue">
        <local:UControlArray Grid.Row ="0"></local:UControlArray>
    </ScrollViewer>
    <StackPanel Orientation="Vertical" Grid.Row="1">
        <Button Width="100" HorizontalAlignment="Left" VerticalAlignment="Bottom">QQ</Button>
        <Button Width="100" HorizontalAlignment="Left" VerticalAlignment="Bottom">AA</Button>
    </StackPanel>

</Grid>

`

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;
namespace Test_Array_Controls_2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}`


<UserControl x:Class="Test_Array_Controls_2.UControlArray"
         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:Test_Array_Controls_2"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<Grid Margin="0,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Name="main" Width="auto" Height="auto">

</Grid></UserControl>`
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;
namespace Test_Array_Controls_2
{
    /// <summary>
    /// Interaction logic for UControlArray.xaml
    /// </summary>
    public partial class UControlArray : UserControl
    {
        private Brush[] mCritBackColour = new Brush[2] { Brushes.LightGreen, Brushes.LightCyan }; //[0] left and [1] right
        public int defaultfontsize = 10;
        static int sz = 200;
        //Button[] btn = new Button[17];
        Button[,] btn = new Button[sz, 17];
        public UControlArray()
        {
            InitializeComponent();
            int x, y;
            double left = 0, top = 0;
            for (y = 0; y < sz; y++)
            {
                Label lblleft = new Label();
                lblleft.Width = 100;
                lblleft.Height = 32;
                lblleft.Margin = new Thickness(left, top, 0, 0);
                lblleft.HorizontalAlignment = HorizontalAlignment.Left;
                lblleft.Content = "Kiri";
                lblleft.Background = Brushes.LightGreen;
                main.Children.Add(lblleft);
                left += lblleft.Width;
                for (x = 0; x < 17; x++)
                {

                    btn[y, x] = new Button();
                    //left += 72;
                    btn[y, x].HorizontalAlignment = HorizontalAlignment.Left;
                    btn[y, x].Margin = new Thickness(left, top, 0, 0);
                    btn[y, x].Height = 32;
                    btn[y, x].Width = 32;
                    btn[y, x].Click += new RoutedEventHandler(Btn_click);
                    btn[y, x].Content = JMVal(x);
                    btn[y, x].ToolTip = Verbal(JMVal(x));
                    btn[y, x].FontSize = 14;
                    btn[y, x].Tag = y + ";" + x; //save information of the x and y
                    main.Children.Add(btn[y, x]);
                    left += 32;
                }
                //
                Label lblright = new Label();
                lblright.Width = 100;
                lblright.Height = 32;
                //left += 100;
                lblright.Margin = new Thickness(left, top, 0, 0);
                lblright.HorizontalAlignment = HorizontalAlignment.Left;
                lblright.Content = "Kanan";
                lblright.Background = Brushes.LightCyan;
                lblright.ToolTip = y;
                lblright.Tag = y;
                main.Children.Add(lblright);
                //
                left = 0;
                top += 64;
            }
        }
        private string Verbal(int i)
        {
            //throw new NotImplementedException();
            string[] Verb = new string[10] { "", "equal", "equal to moderate", "moderate", "moderate to strong", "strong", "strong to very strong", "very strong", "very strong to extremely strong", "extremely strong" };
            return Verb[i];
        }

        //

        private int JMVal(int i) 
        {
            if (i >= 0 & i < 9)
            {
                return (9 - i);
            }
            else if (i >= 9 & i < 17)
            {
                return (i - 7);
            }
            else return 0;
        }
        private void Btn_click(object sender, RoutedEventArgs e)
        {
            Button button = sender as Button;
            string[] InternalData = button.Tag.ToString().Split(';');

            ClearButtons(Convert.ToInt32(InternalData[0]));

            int idx = Convert.ToInt32(InternalData[1]);
            button.FontSize = 22;
            button.FontWeight = FontWeights.Bold;

            if (idx >= 0 & idx <= 7) { button.Background = mCritBackColour[0]; }
            else if (idx >= 9 & idx <= 17) { button.Background = mCritBackColour[1]; }
            else if (idx == 8) { button.Background = Brushes.OrangeRed; }

        }

        private void ClearButtons(int rw)
        {
            //throw new NotImplementedException();
            int i;
            for (i = 0; i < 17; i++)
            {
                btn[rw, i].FontSize = defaultfontsize; // defaultfontsize;
                btn[rw, i].Background = Brushes.LightGray;
                btn[rw, i].FontWeight = FontWeights.Light;
            }

        }
    }
}

1 Ответ

0 голосов
/ 19 февраля 2019

Чтобы компенсировать нежелательный размер в верхней части, я добавил несколько дополнительных строк, чтобы переместить контейнер сетки, основной к вершине отрицательного (sz-1) * 32, следующим образом:

{

                `enter code here`left = 0;
                top += 64;
            }
            //interim measure since there seems to be (sz-1) *64 added to the grid container at the top
            **double tp = (sz - 1) * 32;
            main.Margin= new Thickness(0,-tp,0,0);**
...