Как установить границу TextBlock в сетке? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть несколько текстовых блоков в сетке, которые можно перетаскивать.Я хочу ограничить пользователя, чтобы пользователь не мог перетаскивать текстовый блок за пределы сетки.

Я пробовал несколько способов, например получить положение сетки, чтобы каким-то образом я мог контролировать, но это не такработать как положено.Заранее спасибо.

1 Ответ

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

Это можно сделать довольно легко, используя Canvas внутри Grid, вычисляя координаты TextBlock внутри Canvas и затем непрерывно проверяя, находится ли TextBlock в его границах.Когда TextBlock покидает свои границы, Transform возвращается к последним известным «хорошим» координатам.

XAML

<Grid>
    <Grid Name="GridBounds" Width="600" Height="600" Background="Aqua">
        <Canvas>
            <TextBlock Name="TextBlock1" Text="Drag Me" FontSize="40" ManipulationDelta="TextBlock1_ManipulationDelta" ManipulationMode="TranslateX, TranslateY" HorizontalAlignment="Stretch" Canvas.Left="216" Canvas.Top="234" VerticalAlignment="Stretch"/>
        </Canvas>
    </Grid>
</Grid>

Код позади

    CompositeTransform TextDrag = new CompositeTransform();
    CompositeTransform savedTransform = new CompositeTransform();

    public MainPage()
    {          
        this.InitializeComponent();
        TextBlock1.RenderTransform = TextDrag;
    }

    // Copy Transform X and Y if TextBlock is within bounds
    private void CopyTransform(CompositeTransform orig, CompositeTransform copy)
    {
        copy.TranslateX = orig.TranslateX;
        copy.TranslateY = orig.TranslateY;
    }


    private void TextBlock1_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        TextDrag.TranslateX += e.Delta.Translation.X;
        TextDrag.TranslateY += e.Delta.Translation.Y;           

        CompositeTransform transform = TextBlock1.RenderTransform as CompositeTransform;

        // Get current Top-Left coordinates of TextBlock
        var TextTopLeft = TextBlock1.TransformToVisual(GridBounds).TransformPoint(new Point(0, 0));

        // Get current Bottom-Right coordinates of TextBlock
        var TextBottomRight = TextBlock1.TransformToVisual(GridBounds).TransformPoint(new Point(TextBlock1.ActualWidth, TextBlock1.ActualHeight));

        // Get Top-Left grid coordinates
        var GridTopLeft = (new Point(0, 0));

        // Get Bottom-Right grid coordinates
        var GridBottomRight = (new Point(GridBounds.ActualWidth, GridBounds.ActualHeight));

        if (TextTopLeft.X < GridTopLeft.X || TextBottomRight.X > GridBottomRight.X)
        {
            // Out of bounds on X axis - Revert to copied X transform
            TextDrag.TranslateX = savedTransform.TranslateX; ;
        }

        else if (TextTopLeft.Y < GridTopLeft.Y || TextBottomRight.Y > GridBottomRight.Y)
        {
            // Out of bounds on Y axis - Revert to copied Y transform
            TextDrag.TranslateY = savedTransform.TranslateY;
        }

        else
        {
            // TextBlock is within bounds - Copy X and Y Transform
            CopyTransform(transform, savedTransform);
        }
    }

Вот оно в действии.Here it is in action

...