簡體   English   中英

如何覆蓋不在(xaml / wpf)中的網格上的控件

[英]How do you overlay a control over a grid that it is not in (xaml/wpf)

我有一個網格用作文本框之間的拖放區域,但是,將其放在它們之間會導致文本框移位。 我如何才能使拖放網格位於文本框后面,而不是它們之間?

第一個網格是拖放區域,下面是文本框的代碼:

<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>

我的意思的圖片 ,其中黑框是文本框,紅色包圍的所有內容是可以拖放對象的網格區域。

這對我有用。 后面的代碼是一個溫和的命令,尤其是通過名稱引用droptarget。 將其轉換為綁定到droptarget元素的附加屬性將很容易,這將方便在模板等中使用。無論如何,如果沒有代碼隱藏,就無法進行拖放,因此就可以了。 有時,生活會使您陷入困境。 用它來做,嗯,檸檬。

許多XAML只是在忙亂工作,以使元素彼此重疊,就像您所做的那樣。 Grid.Column / Grid.ColumnSpan東西對於您要考慮的重疊布局很重要。

請注意,TextBoxes使用PreviewDragOver事件,而不使用DragOver DragOver沒有被提出。 不知道這是錯誤還是我的理解錯誤,但是很多人似乎在使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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM