WPF: Lưới có lề / hàng cột / đệm?


137

Có thể dễ dàng chỉ định lề và / hoặc phần đệm cho các hàng hoặc cột trong Lưới WPF không?

Tất nhiên tôi có thể thêm các cột bổ sung vào không gian, nhưng đây có vẻ là một công việc để đệm / lề (nó sẽ cho XAML đơn giản hơn nhiều ). Có ai đó bắt nguồn từ Grid tiêu chuẩn để thêm chức năng này?


4
Một ví dụ hữu ích bạn có thể tìm thấy ở đây: codeproject.com/Articles/107468/WPF-Padded-Grid
peter70

2
Kinda bối rối rằng đây không phải là một phần của các tính năng cơ bản của Lưới ...
uceumern

Cho đến ngày hôm nay, được chứng minh bằng 10 năm câu trả lời, sự thật là không thể dễ dàng và điều tốt nhất nên làm (để tránh làm việc thêm lỗi dễ dàng mỗi khi sử dụng một tế bào) là lấy ra Grid (như được đề xuất trước đó bởi @ peter70 ) để thêm thuộc tính phụ thuộc đệm ô thích hợp sẽ điều khiển thuộc tính Margin của ô con. Đây không phải là một nhiệm vụ dài, và sau đó bạn đã có một điều khiển tái sử dụng. Nhận xét bên ... Lưới thực sự là một điều khiển được thiết kế kém.
phút

Câu trả lời:


10

Bạn có thể viết GridWithMarginlớp của riêng bạn , được kế thừa từ Gridvà ghi đè ArrangeOverridephương thức để áp dụng lề


31
Tôi không hiểu tại sao mọi người cho bạn ngón tay cái bởi vì nó không dễ như bạn nghĩ / mô tả ở đây. Chỉ cần cố gắng thực hiện trong 30 phút và bạn sẽ nhanh chóng thấy rằng câu trả lời của bạn là không thể áp dụng. Ngoài ra, hãy suy nghĩ về kéo dài hàng và cột
Eric Ouellet

89

RowDefinitionColumnDefinitioncó loại ContentElement, và Marginhoàn toàn là một FrameworkElementtài sản. Vì vậy, đối với câu hỏi của bạn, "có dễ dàng không" câu trả lời là không. Và không, tôi chưa thấy bất kỳ bảng bố trí nào thể hiện loại chức năng này.

Bạn có thể thêm các hàng hoặc cột bổ sung như bạn đề xuất. Nhưng bạn cũng có thể đặt lề trên chính một Gridyếu tố hoặc bất kỳ thứ gì có thể đi vào bên trong Grid, vì vậy đó là cách giải quyết tốt nhất của bạn lúc này.


OP không cố gắng đặt lề trên RowDefDef hoặc CộtDefDef. Anh ta đang cố gắng thiết lập một lề cho những đứa trẻ trực quan của lưới, xuất phát từ FrameworkEuity.
15ee8f99-57ff-4f92-890c-b56153

57

Sử dụng một Borderđiều khiển bên ngoài điều khiển ô và xác định phần đệm cho điều đó:

    <Grid>
        <Grid.Resources >
            <Style TargetType="Border" >
                <Setter Property="Padding" Value="5,5,5,5" />
            </Style>
        </Grid.Resources>

        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <Border Grid.Row="0" Grid.Column="0">
            <YourGridControls/>
        </Border>
        <Border Grid.Row="1" Grid.Column="0">
            <YourGridControls/>
        </Border>

    </Grid>


Nguồn:


2
@RichardEverett Kiểm tra đường về máy: liên kết được cập nhật trong câu trả lời.
CJBS

Tôi thích câu trả lời này nhất. Nó cung cấp một giải pháp cho câu hỏi ban đầu và nó thẳng tiến. Cảm ơn!
Tobias

Điều này thật dễ dàng và thiết thực
aggieol

19

Bạn có thể sử dụng một cái gì đó như thế này:

<Style TargetType="{x:Type DataGridCell}">
  <Setter Property="Padding" Value="4" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type DataGridCell}">
        <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
          <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>

Hoặc nếu bạn không cần TemplateBindings:

<Style TargetType="{x:Type DataGridCell}">
   <Setter Property="Template">
      <Setter.Value>
          <ControlTemplate TargetType="{x:Type DataGridCell}">
              <Border Padding="4">
                  <ContentPresenter />
              </Border>
          </ControlTemplate>
      </Setter.Value>
  </Setter>
</Style>

28
Cảm ơn JayGee, tuy nhiên giải pháp này dành cho DataGrid - không phải điều khiển Grid tiêu chuẩn.
Brad Leach

Nhấp vào không gian đệm không chọn hàng nữa.
Jor

9

Tôi nghĩ tôi sẽ thêm giải pháp của riêng mình vì chưa ai đề cập đến điều này. Thay vì thiết kế UserControl dựa trên Grid, bạn có thể nhắm mục tiêu các điều khiển có trong lưới bằng khai báo kiểu. Quan tâm đến việc thêm phần đệm / lề cho tất cả các phần tử mà không phải xác định cho từng phần tử, điều này rất cồng kềnh và tốn nhiều công sức. Ví dụ, nếu Lưới của bạn không chứa gì ngoài TextBlocks, bạn có thể thực hiện việc này:

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="Margin" Value="10"/>
</Style>

Nó giống như tương đương với "tế bào đệm".


điều này có nhỏ giọt không? chẳng hạn, nếu bạn có một stackpanel trong một hàng lưới, liệu các trình chặn văn bản của stackpanel có thừa hưởng thuộc tính này không?
Maslow

Không chắc chắn nếu nó lừa trẻ em ngay lập tức, nhưng bạn có thể tìm ra với một bài kiểm tra đơn giản.
James M

2
@Maslow Câu trả lời hoàn toàn là 'Có', nhưng cách diễn đạt của bạn hơi sai lệch. Không có sự thừa kế nào của Marginbất động sản đang diễn ra, đó là bất kỳ điều gì Styletrong một ResourceDictionarysẽ áp dụng cho mọi yếu tố của nó TargetTypeở mọi nơi trong toàn bộ phạm vi của yếu tố chủ sở hữu từ điển đó. Vì vậy, đó là những Stylemánh khóe, không phải tài sản.
Glenn Slayden

8

Điều này không quá khó khăn. Tôi không thể nói nó khó khăn như thế nào trong năm 2009 khi câu hỏi được hỏi, nhưng đó là sau đó.

Lưu ý rằng nếu bạn đặt rõ ràng một lề trực tiếp trên con của lưới khi sử dụng giải pháp này, thì lề đó sẽ xuất hiện trong trình thiết kế nhưng không phải trong thời gian chạy.

Thuộc tính này có thể được áp dụng cho Grid, StackPanel, WrapPanel, UniformGrid hoặc bất kỳ hậu duệ nào khác của Panel. Nó ảnh hưởng đến trẻ em ngay lập tức. Nó được cho là trẻ em sẽ muốn quản lý bố cục nội dung của riêng mình.

PanelExt.cs

public static class PanelExt
{
    public static Thickness? GetChildMargin(Panel obj)
    {
        return (Thickness?)obj.GetValue(ChildMarginProperty);
    }

    public static void SetChildMargin(Panel obj, Thickness? value)
    {
        obj.SetValue(ChildMarginProperty, value);
    }

    /// <summary>
    /// Apply a fixed margin to all direct children of the Panel, overriding all other margins.
    /// Panel descendants include Grid, StackPanel, WrapPanel, and UniformGrid
    /// </summary>
    public static readonly DependencyProperty ChildMarginProperty =
        DependencyProperty.RegisterAttached("ChildMargin", typeof(Thickness?), typeof(PanelExt),
            new PropertyMetadata(null, ChildMargin_PropertyChanged));

    private static void ChildMargin_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var target = d as Panel;

        target.Loaded += (s, e2) => ApplyChildMargin(target, (Thickness?)e.NewValue);

        ApplyChildMargin(target, (Thickness?)e.NewValue);
    }

    public static void ApplyChildMargin(Panel panel, Thickness? margin)
    {
        int count = VisualTreeHelper.GetChildrenCount(panel);

        object value = margin.HasValue ? margin.Value : DependencyProperty.UnsetValue;

        for (var i = 0; i < count; ++i)
        {
            var child = VisualTreeHelper.GetChild(panel, i) as FrameworkElement;

            if (child != null)
            {
                child.SetValue(FrameworkElement.MarginProperty, value);
            }
        }
    }
}

Bản giới thiệu:

MainWindow.xaml

<Grid
    local:PanelExt.ChildMargin="2"
    x:Name="MainGrid"
    >
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Rectangle Width="100" Height="40" Fill="Red" Grid.Row="0" Grid.Column="0" />
    <Rectangle Width="100" Height="40" Fill="Green" Grid.Row="1" Grid.Column="0" />
    <Rectangle Width="100" Height="40" Fill="Blue" Grid.Row="1" Grid.Column="1" />

    <Button Grid.Row="2" Grid.Column="0" Click="NoMarginClick">No Margin</Button>
    <Button Grid.Row="2" Grid.Column="1" Click="BigMarginClick">Big Margin</Button>
    <ComboBox Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" />
</Grid>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void NoMarginClick(object sender, RoutedEventArgs e)
    {
        //  In real life, if we wanted to change PanelExt.ChildMargin at runtime, we 
        //  would prefer to bind it to something, probably a dependency property of 
        //  the view. But this will do for a demonstration. 
        PanelExt.SetChildMargin(MainGrid, null);
    }
    private void BigMarginClick(object sender, RoutedEventArgs e)
    {
        PanelExt.SetChildMargin(MainGrid, new Thickness(20));
    }
}

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Bạn có biết tại sao câu trả lời của bạn bị hạ thấp? Có vẻ như là một giải pháp hiệu quả cho vấn đề của OP
hệ thống

4
@thesystem Tôi nghĩ ai đó đã buồn về điều gì đó. Không phải là một thỏa thuận lớn. Nhưng có lẽ có một lỗi trong đó mà tôi đã bỏ lỡ. Nó xảy ra.
15ee8f99-57ff-4f92-890c-b56153

có phải vì nó yêu cầu một buildhoặc runtrước khi xem trước trực tiếp có thể được hiển thị? Tốt và đơn giản. 1 lên.
Mèo Meow 2012

3

Tôi gặp phải vấn đề này trong khi phát triển một số phần mềm gần đây và nó đã xảy ra với tôi để hỏi TẠI SAO? Tại sao họ lại làm điều này ... câu trả lời đã ở ngay trước mặt tôi. Một hàng dữ liệu là một đối tượng, vì vậy nếu chúng ta duy trì hướng đối tượng, thì thiết kế cho một hàng cụ thể sẽ được tách biệt (giả sử bạn cần sử dụng lại hiển thị hàng sau này trong tương lai). Vì vậy, tôi bắt đầu sử dụng bảng ngăn xếp dữ liệu và điều khiển tùy chỉnh cho hầu hết các hiển thị dữ liệu. Danh sách đã xuất hiện thường xuyên nhưng chủ yếu là lưới chỉ được sử dụng cho tổ chức trang chính (Tiêu đề, Khu vực menu, Khu vực nội dung, Khu vực khác). Các đối tượng tùy chỉnh của bạn có thể dễ dàng quản lý mọi yêu cầu về khoảng cách cho từng hàng trong bảng ngăn xếp hoặc lưới (một ô lưới có thể chứa toàn bộ đối tượng hàng. Điều này cũng có thêm lợi ích của việc phản ứng đúng với các thay đổi theo hướng,

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
  </Grid.RowDefinitions>

  <custom:MyRowObject Style="YourStyleHereOrGeneralSetter" Grid.Row="0" />
  <custom:MyRowObject Style="YourStyleHere" Grid.Row="1" />
</Grid>

hoặc là

<StackPanel>
  <custom:MyRowObject Style="YourStyleHere" Grid.Row="0" />
  <custom:MyRowObject Style="YourStyleHere" Grid.Row="1" />
</StackPanel>

Các điều khiển tùy chỉnh của bạn cũng sẽ kế thừa DataContext nếu bạn sử dụng ràng buộc dữ liệu ... lợi ích yêu thích cá nhân của tôi đối với phương pháp này.


Những gì bạn đã cố gắng làm ở đây là tạo một phiên bản thô của ListViewđiều khiển WPF trong GridViewchế độ, nhưng không có điều khoản nào để làm cho tất cả các Row Rowbbjects có cùng chiều rộng cột. Trong thực tế, nó không còn liên quan nhiều đến Grid.
Glenn Slayden

3

trong uwp (phiên bản Windows10FallCreatorsUpdate trở lên)

<Grid RowSpacing="3" ColumnSpacing="3">

Điều này cũng áp dụng với Xamarin.Forms.
James M

3

Đã chỉnh sửa:

Để tạo lề cho bất kỳ điều khiển nào, bạn có thể bọc điều khiển bằng đường viền như thế này

<!--...-->
    <Border Padding="10">
            <AnyControl>
<!--...-->

Vấn đề OP không phải là có lề xung quanh lưới, mà là lề xung quanh các ô lưới (hoặc như thực sự được hỏi xung quanh các hàng và cột, sau đó mâu thuẫn bằng cách " thêm các cột / hàng bổ sung chính xác là những gì tôi đang cố tránh " bình luận) .
phút

2

Tôi đã làm điều đó ngay bây giờ với một trong những lưới của tôi.

  • Đầu tiên áp dụng cùng một lề cho mọi phần tử bên trong lưới. Bạn có thể thực hiện việc này, sử dụng các kiểu hoặc bất cứ thứ gì bạn thích. Hãy nói rằng bạn muốn khoảng cách ngang là 6px và khoảng cách dọc là 2px. Sau đó, bạn thêm lề "3px 1px" cho mỗi phần tử con của lưới.
  • Sau đó loại bỏ các lề được tạo xung quanh lưới (nếu bạn muốn căn chỉnh các đường viền của các điều khiển bên trong lưới với cùng một vị trí của lưới). Thực hiện việc này để đặt lề "-3px -1px" vào lưới. Theo cách đó, các điều khiển khác bên ngoài lưới sẽ được căn chỉnh với các điều khiển ngoài cùng bên trong lưới.

Áp dụng cùng một lề cho mọi phần tử bên trong lưới dường như là cách dễ nhất.
Envil

1

Một khả năng sẽ là thêm các hàng và cột có chiều rộng cố định để đóng vai trò là phần đệm / lề bạn đang tìm kiếm.

Bạn cũng có thể xem xét rằng bạn bị hạn chế bởi kích thước của thùng chứa của bạn và lưới sẽ trở nên lớn bằng phần tử chứa hoặc chiều rộng và chiều cao được chỉ định của nó. Bạn chỉ có thể sử dụng các cột và hàng không có chiều rộng hoặc chiều cao được đặt. Bằng cách đó, họ mặc định phá vỡ toàn bộ không gian trong lưới. Sau đó, nó sẽ chỉ là một phương tiện tập trung các yếu tố của bạn theo chiều dọc và chiều ngang trong lưới của bạn.

Một phương pháp khác có thể là bọc tất cả các thành phần lưới trong một cố định với lưới hàng & cột đơn có kích thước và lề cố định. Lưới của bạn chứa các hộp chiều rộng / chiều cao cố định có chứa các yếu tố thực tế của bạn.


1
Cảm ơn Adam, tuy nhiên việc thêm các cột / hàng bổ sung chính xác là những gì tôi đã cố gắng tránh. Tôi chỉ đơn giản muốn giảm đánh dấu của mình và có thể chỉ định lề hoặc phần đệm sẽ giúp ích cho việc này.
Brad Leach

Bạn chỉ phải xác định các cột và hàng bổ sung, không thêm đánh dấu cho chúng. Ví dụ: nếu bạn muốn thêm N chiều rộng giữa các cột cho 3 cột, bạn sẽ có 5 định nghĩa cột. Đầu tiên sẽ là chiều rộng tự động, và cố định tiếp theo, sau đó tự động, sau đó cố định, sau đó tự động. Sau đó chỉ gán các cột 1, 3 và 5 cho các yếu tố nội dung thực tế. Tôi thấy quan điểm của bạn về việc đánh dấu cột thêm, nhưng trừ khi bạn có hàng trăm yếu tố, điều đó có vẻ tầm thường đối với tôi. cuộc gọi của bạn mặc dù. Ngoài ra, bạn đã thử sử dụng bảng ngăn xếp của bảng ngăn xếp với lề được đặt chưa?
Adam Lenda

Đối với trường hợp của tôi, việc thêm một cột "splitter / lề" cho đến nay là sạch nhất và dễ nhất. Cảm ơn!
jchristof

1

Tôi đã gặp vấn đề tương tự gần đây trong lưới hai cột, tôi chỉ cần một lề trên các phần tử ở cột bên phải. Tất cả các yếu tố trong cả hai cột đều thuộc loại TextBlock.

<Grid.Resources>
    <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource OurLabelStyle}">
        <Style.Triggers>
            <Trigger Property="Grid.Column" Value="1">
                <Setter Property="Margin" Value="20,0" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Grid.Resources>

0

Mặc dù bạn không thể thêm lề hoặc phần đệm vào Lưới, bạn có thể sử dụng một cái gì đó như Khung (hoặc thùng chứa tương tự), mà bạn có thể áp dụng nó cho.

Theo cách đó (nếu bạn hiển thị hoặc ẩn điều khiển trên một nút bấm nói), bạn sẽ không cần thêm lề trên mọi điều khiển có thể tương tác với nó.

Hãy nghĩ về nó như cách ly các nhóm điều khiển thành các đơn vị, sau đó áp dụng kiểu cho các đơn vị đó.


0

Như đã nêu trước khi tạo một lớp GridWithMargins. Dưới đây là ví dụ mã làm việc của tôi

public class GridWithMargins : Grid
{
    public Thickness RowMargin { get; set; } = new Thickness(10, 10, 10, 10);
    protected override Size ArrangeOverride(Size arrangeSize)
    {
        var basesize = base.ArrangeOverride(arrangeSize);

        foreach (UIElement child in InternalChildren)
        {
            var pos = GetPosition(child);
            pos.X += RowMargin.Left;
            pos.Y += RowMargin.Top;

            var actual = child.RenderSize;
            actual.Width -= (RowMargin.Left + RowMargin.Right);
            actual.Height -= (RowMargin.Top + RowMargin.Bottom);
            var rec = new Rect(pos, actual);
            child.Arrange(rec);
        }
        return arrangeSize;
    }

    private Point GetPosition(Visual element)
    {
        var posTransForm = element.TransformToAncestor(this);
        var areaTransForm = posTransForm.Transform(new Point(0, 0));
        return areaTransForm;
    }
}

Sử dụng:

<Window x:Class="WpfApplication1.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:WpfApplication1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:GridWithMargins ShowGridLines="True">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Rectangle Fill="Red" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
            <Rectangle Fill="Green" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
            <Rectangle Fill="Blue" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        </local:GridWithMargins>
    </Grid>
</Window>

1
Ném hệ thống.ArgumentException: 'Chiều rộng phải không âm.' thực tế.Width - = Math.Min (thực tế.Width, RowMargin.Left + RowMargin.Right); thực tế.Height - = Math.Min (thực tế.Height, RowMargin.Top + RowMargin.Bottom);
Jamie Mellway

Với bản sửa lỗi của Jamie, nó chạy, nhưng vẫn không làm những gì nó phải làm. Với chiều cao hàng và chiều rộng cột được đặt thành Tự động, nó thực hiện sai cách theo một cách khác.
15ee8f99-57ff-4f92-890c-b56153

0

Tôi ngạc nhiên tôi không thấy giải pháp này được đăng.

Đến từ web, các khung như bootstrap sẽ sử dụng lề âm để kéo lại các hàng / cột.

Nó có thể là một ít dài dòng (mặc dù không phải là xấu), nó hoạt động và các yếu tố cách đều nhau và kích thước.

Trong ví dụ dưới đây, tôi sử dụng một StackPanelgốc để chứng minh làm thế nào 3 nút cách đều nhau bằng cách sử dụng lề. Bạn có thể sử dụng các yếu tố khác, chỉ cần thay đổi nút x: Nhập từ nút sang thành phần của bạn.

Ý tưởng rất đơn giản, sử dụng lưới ở bên ngoài để kéo lề của các phần tử ra khỏi giới hạn của chúng bằng một nửa lượng lưới bên trong (sử dụng lề âm), sử dụng lưới bên trong để làm đều các phần tử với số lượng bạn muốn.

Cập nhật: Một số nhận xét từ một người dùng cho biết nó không hoạt động, đây là một video nhanh minh họa: https://youtu.be/rPx2OdtSOYI

nhập mô tả hình ảnh ở đây

    <StackPanel>
        <Grid>
            <Grid.Resources>
                <Style TargetType="{x:Type Grid}">
                    <Setter Property="Margin" Value="-5 0"/>
                </Style>
            </Grid.Resources>

            <Grid>
                <Grid.Resources>
                    <Style TargetType="{x:Type Button}">
                        <Setter Property="Margin" Value="10 0"/>
                    </Style>
                </Grid.Resources>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <Button Grid.Column="0" Content="Btn 1" />
                <Button Grid.Column="1" Content="Btn 2" />
                <Button Grid.Column="2" Content="Btn 3" />
            </Grid>

        </Grid>

        <TextBlock FontWeight="Bold" Margin="0 10">
            Test
        </TextBlock>
    </StackPanel>

1
Lỗi của tôi - Tôi đã không nhận thấy kiểu Nút ẩn. Tôi đã bị phân tâm bởi một chút về lợi nhuận âm.
15ee8f99-57ff-4f92-890c-b56153

-6

Đôi khi phương pháp đơn giản là tốt nhất. Chỉ cần đệm chuỗi của bạn với không gian. Nếu nó chỉ là một vài hộp văn bản, vv thì đây là phương pháp đơn giản nhất.

Bạn cũng có thể chỉ cần chèn các cột / hàng trống với kích thước cố định. Vô cùng đơn giản và bạn có thể dễ dàng thay đổi nó.


Có lẽ bởi vì nó không phải là một phương pháp tốt. Sử dụng khoảng trắng có thể là "lối thoát dễ dàng", nhưng thực tế đó là một vụ hack. Điều đó không chính xác, nó có thể (và có thể sẽ) hiển thị khác nhau và không đáng tin cậy trên các màn hình có tỷ lệ khác nhau và bạn không kiểm soát được lượng không gian chính xác mà bạn tạo. Chèn các cột / hàng trống sẽ tạo ra một mớ hỗn độn của lưới của bạn ...
Đánh dấu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.