如何将控件叠加在不在的网格上(xaml / wpf)

时间:2016-06-16 19:15:00

标签: c# wpf xaml

我有一个网格,用作文本框之间的拖放区域,但是,将它放在它们之间会导致文本框被移位。如何获取它以使拖放网格位于文本框后面而不是它们之间?

第一个网格是拖放区域,下面是文本框的代码:

<Grid Grid.Column="0" Height="Auto" Width="20" AllowDrop="True" Background="White"
      DragEnter="Grid_DragEnter" DragLeave="Grid_DragLeave" Drop="Grid_Drop" Tag="{Binding}"/>

<Grid>
   <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
   </Grid.ColumnDefinitions>
   <TextBlock HorizontalAlignment="Left" Margin="5,2" 
        Text="some text" 
        VerticalAlignment="Center" FontSize="5" />
</Grid>

A picture of what I mean,其中黑框是文本框,红色中包含的所有内容都是可以拖放内容的网格区域。

1 个答案:

答案 0 :(得分:1)

这对我有用。代码背后是一个温和的无赖,特别是通过名称引用droptarget。很容易将它转换为绑定到droptarget元素的附加属性,这样可以方便地在模板中使用等。无论如何你不能在没有代码隐藏的情况下拖放,所以你就是这样。有时生活会给你代码隐藏。用它,呃,制造,嗯,柠檬。

很多这样的XAML只是乱七八糟地让元素与你的方式相互重叠。 Grid.Column / Grid.ColumnSpan内容对于您考虑的重叠布局非常重要。

请注意,TextBoxes使用PreviewDragOver事件,而不是DragOverDragOver没有被提出。不确定这是一个错误还是我的错误理解,但很多人似乎在使用DragOver使用WPF TextBox时遇到了麻烦。

XAML:

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

    <Grid 
        Grid.Column="0"
        Grid.ColumnSpan="2"
        Margin="80,0,80,0"
        Height="80"
        VerticalAlignment="Center"
        HorizontalAlignment="Stretch"
        Drop="TextBox_Drop"
        DragOver="TextBox_DragOver"
        Background="DeepSkyBlue"
        x:Name="DropTargetGrid"
        AllowDrop="True"
        ></Grid>

    <TextBox 
        Grid.Column="0"
        Margin="40,40,10,40" 
        Drop="TextBox_Drop"
        PreviewDragOver="TextBox_DragOver"
        AllowDrop="True"
        VerticalAlignment="Center"
        />

    <TextBox 
        Grid.Column="1"
        Margin="10,40,40,40" 
        Drop="TextBox_Drop"
        PreviewDragOver="TextBox_DragOver"
        AllowDrop="True"
        VerticalAlignment="Center"
        />
</Grid>

代码背后:

private void TextBox_Drop(object sender, DragEventArgs e)
{
    //  Do whatever
}

private void TextBox_DragOver(object sender, DragEventArgs e)
{
    var ptTargetClient = e.GetPosition(DropTargetGrid);

    if (ptTargetClient.X >= 0 && ptTargetClient.X <= DropTargetGrid.ActualWidth
        && ptTargetClient.Y >= 0 && ptTargetClient.Y <= DropTargetGrid.ActualHeight)
    {
        e.Handled = true;
        e.Effects = DragDropEffects.Move;
    }
}