【问题标题】:Drag/Drop Issue In SL3SL3 中的拖放问题
【发布时间】:2019-06-10 18:06:31
【问题描述】:

我在 Silverlight 3 中有一个 UserControl。

LayoutRoot 网格包含一个子网格,即一个网格,由三列两行组成。

下面是布局:

<Grid x:Name="LayoutRoot" Background="White">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <Grid x:Name="NavigationGrid" Grid.RowSpan="2" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <!-- Content placed here -->
        </Grid>
        <Border Background="Transparent"  Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="0" BorderBrush="Black" BorderThickness="0,0,0,0" Height="38" HorizontalAlignment="Stretch" Width="Auto">
            <!-- Content placed here -->
        </Border>
        <Border Background="Transparent" Grid.Column="2" Grid.Row="1" Grid.RowSpan="2" BorderBrush="Black" BorderThickness="0,0,1,1" Height="Auto" VerticalAlignment="Stretch" Width="38">
            <!-- Content placed here -->
        </Border>
        <Border Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto" Background="White" BorderBrush="Black" BorderThickness="0,0,1,1" Width="Auto">
            <!-- Content placed here -->
        </Border>
    </Grid>
</Grid>

我有使用装饰器的功能。装饰器将自己附加到指定的框架元素。

当用户单击位于名为 NavigationGrid 的网格右上角的按钮时,将调用此功能。该按钮包含一个图钉的图标。此功能从其父子网格中删除 NavigationGrid 网格,并将其添加到 LayoutRoot 网格的子网格中。装饰器允许用户在屏幕上拖动网格。

如果用户再次单击图钉按钮,则预期的功能是将网格从 LayoutRoot 子级中删除,并通过 Grid.Column、Grid.RowSpan 等添加回其原始父级的子级。价值观。

我遇到的问题是,当 NavigationGrid 网格最初从其父子级中删除时,网格中的所有其他元素都会调整大小等。这没关系,因为这正是我想要的。但是,当网格放回它的父子节点时,它的位置与原来的位置不同。我检查了 Margin 属性,它被设置为 0。所以,因为它的位置与它的原始位置不同,我以编程方式将它的边距设置为一个负值,让它在视觉上回到原来的位置。这会抛出其他元素的位置,一切都开始重叠等等。

所以,我的问题是,有谁知道我可以如何实现此功能,以便可以将 NavigationGrid 网格从其父级中删除,然后再放回其父级,而它的原始放置/位置保持不变?

谢谢。

克里斯

以下是用户界面的屏幕截图。出于显而易见的原因,我已将 UI 的某些部分涂黑。左侧带有“进程”标签的网格是用户应该能够“取消固定”并四处移动的网格,它确实有效,正是将其放回原位的功能会产生问题。

请参阅下面处理 pin/unpin 功能的代码隐藏方法:

public void PinMenu(object parameter)
    {
        if (_navigationGridPinned)
        {
            PushPinImagePath = new Uri("../Images/pushpin_pinned.png", UriKind.Relative);

            _navigationGridPinned = false;

            var e = parameter as MouseButtonEventArgs;

            if (!e.IsNull())
            {
                var grid = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "NavigationGrid") as Grid;

                if (!grid.IsNull())
                {
                    grid.MeasureAndArrange();

                    double gridHeight = grid.ActualHeight;

                    double gridWidth = grid.ActualWidth;

                    grid.HorizontalAlignment = HorizontalAlignment.Left;

                    grid.VerticalAlignment = VerticalAlignment.Top;

                    grid.Margin = new Thickness(0, 0, 0, 0);

                    var parent = grid.Parent as Grid;

                    parent.Children.Remove(grid);

                    var layoutRootGrid = parent.Parent as Grid;

                    if (!layoutRootGrid.IsNull())
                    {
                        _originalOffset = parent.TransformToVisual(layoutRootGrid).Transform(new Point(0, 0));

                        grid.Height = gridHeight;

                        grid.Width = gridWidth;

                        var border = grid.Children[0] as Border;

                        if (!border.IsNull())
                        {
                            border.BorderThickness = new Thickness(1, 1, 1, 1);

                            var backgroundBrush = App.Current.Resources["GradientBlueBrush"] as LinearGradientBrush;

                            if (!backgroundBrush.IsNull())
                            {
                                border.Background = backgroundBrush;
                            }
                        }

                        layoutRootGrid.Children.Add(grid);

                        Grid.SetRow(grid, 1);

                        _adorner = new Adorner();

                        _adorner.HorizontalAlignment = HorizontalAlignment.Left;

                        _adorner.VerticalAlignment = VerticalAlignment.Top;

                        _adorner.AdornedElement = grid as FrameworkElement;

                        _adorner.adorned_MouseLeftButtonDown((FrameworkElement)grid, e);
                    }
                }
            }
        }
        else
        {
            _navigationGridPinned = true;

            PushPinImagePath = new Uri("../Images/pushpin.png", UriKind.Relative);

            var grid = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "NavigationGrid") as Grid;

            if (!grid.IsNull())
            {
                var parent = grid.Parent as Grid;

                if (parent != null)
                {
                    var mainViewGrid = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "MainViewGrid") as Grid;

                    var parentGrid = mainViewGrid.Parent as Grid;

                    var layoutRootGrid = parentGrid.Parent as Grid;

                    var currentOffset = grid.TransformToVisual(layoutRootGrid).Transform(new Point(0, 0));

                    Point p = new Point(-(currentOffset.X - _originalOffset.X), -(currentOffset.Y - _originalOffset.Y));

                    parent.Children.Remove(grid);

                    parent.UpdateLayout();

                    grid.MeasureAndArrange();

                    var navBorder = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "NavBorder") as Border;

                    var tabMenuBorder = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "TabMenuBorder") as Border;

                    var processMapBorder = ValidationHelper.GetPanelFromVisualTree(Application.Current.RootVisual, "ProcessMapBorder") as Border;

                    mainViewGrid.Children.Clear();

                    var border = grid.Children[0] as Border;

                    if (!border.IsNull())
                    {
                        border.Background = new SolidColorBrush(Colors.Transparent);

                        border.BorderThickness = new Thickness(1, 0, 1, 1);
                    }

                    _adorner.HorizontalAlignment = HorizontalAlignment.Left;

                    _adorner.VerticalAlignment = VerticalAlignment.Top;

                    _adorner.Margin = new Thickness(0, 0, 0, 0);

                    _adorner.AdornedElement = null;

                    mainViewGrid.Children.Add(tabMenuBorder);

                    Grid.SetColumn(tabMenuBorder, 2);

                    Grid.SetRowSpan(tabMenuBorder, 2);

                    Grid.SetRow(tabMenuBorder, 1);

                    mainViewGrid.Children.Add(processMapBorder);

                    Grid.SetColumn(processMapBorder, 1);

                    Grid.SetRow(processMapBorder, 1);

                    mainViewGrid.Children.Add(navBorder);

                    Grid.SetColumnSpan(navBorder, 2);

                    Grid.SetRow(navBorder, 0);

                    Grid.SetColumn(navBorder, 1);

                    grid.Margin = new Thickness(p.X, p.Y, 0, 0);

                    mainViewGrid.Children.Add(grid);

                    Grid.SetColumn(grid, 0);

                    Grid.SetRow(grid, 0);

                    Grid.SetRowSpan(grid, 2);
                }
            }
        }
    }

【问题讨论】:

  • 请截图和代码隐藏。
  • 根据您的要求,我编辑了原始帖子以包含屏幕截图和代码隐藏。如果您需要更多信息,请告诉我。

标签: c# silverlight


【解决方案1】:

一种策略可能是将您的“NavigationGrid”包装在容器网格“ContainerGrid”中,该容器网格在固定时为“可见”,在取消固定时为“折叠”。这样,在 pin 操作期间重新设置父级时,您可以将“NavigationGrid”放回名为“ContainerGrid”的内部。

【讨论】:

  • 我试过你的建议,问题依旧;但是,它确实让我查看了 NavigationGrid 的 RenderTransform,它被装饰者设置为新的 MatrixTransform。因此,当我将菜单固定回来时,我并没有将 NavigationGrid 的 RenderTransform 设置为 null。这解决了这个问题,但你的建议让我看到了这个问题,所以,我会给你功劳。
猜你喜欢
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
相关资源
最近更新 更多