可调整大小的多个文本框

Resizeable multiple TextBoxes

我将创建一些可调整大小(通过拖动)多个文本框的程序。

但是,我不知道如何构建此布局。有知道如何创建拖动布局吗?

不完全清楚您的确切规格是什么。但是绘图使它看起来像您希望网格中的 一些 单元格具有不同宽度的抓握手柄,而其他单元格则没有。为此,您应该能够使用 GridSplitter object.

例如:

<Window x:Class="TestSO36334781GridSplitter.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:p="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

  <StackPanel>
    <Border BorderBrush="Black" BorderThickness="1">
      <Grid>
        <Grid.Resources>
          <p:Style TargetType="GridSplitter">
            <Setter Property="HorizontalAlignment" Value="Right"/>
            <Setter Property="VerticalAlignment" Value="Stretch"/>
            <Setter Property="Width" Value="5"/>
            <Setter Property="Height" Value="10"/>
            <Setter Property="Background" Value="Black"/>

            <!-- Offset the splitter visually so it's centered over the gridline -->
            <Setter Property="RenderTransform">
              <Setter.Value>
                <TranslateTransform X="2.5" Y="0"/>
              </Setter.Value>
            </Setter>
          </p:Style>
          <p:Style TargetType="TextBox">
            <Setter Property="Height" Value="30"/>
          </p:Style>
        </Grid.Resources>
        <Grid.RowDefinitions>
          <RowDefinition/>
          <RowDefinition/>
          <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
          <ColumnDefinition/>
          <ColumnDefinition/>
          <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <TextBlock Text="Label1" Grid.Column="0"/>
        <TextBlock Text="Label1" Grid.Column="1"/>
        <TextBlock Text="Label1" Grid.Column="2"/>

        <TextBox Grid.Row="1" Grid.Column="0"/>
        <TextBox Grid.Row="1" Grid.Column="1"/>
        <TextBox Grid.Row="1" Grid.Column="2"/>

        <GridSplitter Grid.Row="1" Grid.Column="0"/>
        <GridSplitter Grid.Row="1" Grid.Column="1"/>

        <TextBox Grid.Row="2" Grid.ColumnSpan="3" Text="A wide textbox here"/>
      </Grid>
    </Border>
  </StackPanel>
</Window>

上面显示了一个网格,中间一行有三个 TextBox 控件,用户可以通过拖动每个控件之间的 GridSplitter 来修改控件的宽度。它们上方的标签(即 TextBlock objects)也是 moved/resized,因为它们与各自的 TextBox.

共享同一列

显示第四个 TextBox,在最后一行跨越三列,以显示如何仍然可以拥有独立于拆分器的其他网格元素。我假设您可以修改基本思想以满足您的特定需求。

请注意,为拆分器 object 提供特定格式非常重要,并且它们出现在 之后 与它们共享网格元素的控件,以便它们在 z-order.

中的那些控件之上

另请参阅此 Stack Overflow 问题:WPF user controlled grid column width

附录:

正如 Joey 在(现已删除的)评论中所暗示的那样,可以放置拆分器控件,而无需它们与网格中的其他元素共享(并可能遮挡)单元格。以下 XAML 片段(即 Grid 元素)显示了它的工作原理:

<Grid>
  <Grid.Resources>
    <p:Style TargetType="GridSplitter">
      <Setter Property="HorizontalAlignment" Value="Right"/>
      <Setter Property="VerticalAlignment" Value="Stretch"/>
      <Setter Property="Width" Value="5"/>
      <Setter Property="Height" Value="10"/>
      <Setter Property="Background" Value="Black"/>
    </p:Style>
    <p:Style TargetType="TextBox">
      <Setter Property="Height" Value="30"/>
    </p:Style>
  </Grid.Resources>
  <Grid.RowDefinitions>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition/>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition/>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition/>
  </Grid.ColumnDefinitions>

  <TextBlock Text="Label1" Grid.Column="0"/>
  <TextBlock Text="Label1" Grid.Column="2"/>
  <TextBlock Text="Label1" Grid.Column="4"/>

  <TextBox Grid.Row="1" Grid.Column="0"/>
  <TextBox Grid.Row="1" Grid.Column="2"/>
  <TextBox Grid.Row="1" Grid.Column="4"/>

  <GridSplitter Grid.Row="1" Grid.Column="1" ResizeBehavior="PreviousAndNext"/>
  <GridSplitter Grid.Row="1" Grid.Column="3" ResizeBehavior="PreviousAndNext"/>

  <TextBox Grid.Row="2" Grid.ColumnSpan="5" Text="A wide textbox here"/>
</Grid>

以上消除了对 RenderTransform 的需要,因为每个 GridSplitter 都在其自己的列中居中。 ResizeBehavior 设置为 PreviousAndNext,这样拖动拆分器不会影响包含拆分器的列的宽度,而是影响其前后列的宽度。


您可以在这种情况下应用 DataGrid 控件并让它执行您想要的操作。但是你的问题中没有任何内容向我暗示你需要 DataGrid 的完整功能集,甚至你会对涉及的一些限制感到满意(例如标题的格式设置方式,以及是否可以在布局中包含其他 fixed-width 元素。