如何在运行时为用户创建可调整大小的面板? WPF,XAML

时间:2013-08-29 01:31:34

标签: wpf xaml user-interface expression-blend

我正在尝试让网格在运行时由用户调整大小。我发现了很多例子,但是它们似乎都是通过使用装饰等来使它变得过于复杂。

然而,我确实找到了一个理想的解决方案:

https://resizablegrid.codeplex.com/

它使用拇指,看起来很简单。但是,当我编辑模板(删除除SE中的所有拇指之外的所有拇指)时,它会中断 - 它不再可调整大小(即使我没有对模板进行任何更改也是如此)。

我只想在右下角使用一个简单的控件,例如拇指或ResizeGrip,这样可以让用户调整面板的大小。

即使替代解决方案有点复杂,我仍然想知道所涉及的步骤。

1 个答案:

答案 0 :(得分:6)

您可以使用Thumb来计算调整大小逻辑并覆盖Style的{​​{1}},然后您可以ContentPresenter添加Grid < / p>

工作示例:

代码:

ContentPresenter

}

的Xaml:

namespace WpfApplication12
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class ResizeThumb : Thumb
    {
        public ResizeThumb()
        {
            DragDelta += new DragDeltaEventHandler(this.ResizeThumb_DragDelta);
        }

        private void ResizeThumb_DragDelta(object sender, DragDeltaEventArgs e)
        {
            Control designerItem = this.DataContext as Control;

            if (designerItem != null)
            {
                double deltaVertical, deltaHorizontal;

                switch (VerticalAlignment)
                {
                    case VerticalAlignment.Bottom:
                        deltaVertical = Math.Min(-e.VerticalChange, designerItem.ActualHeight - designerItem.MinHeight);
                        designerItem.Height -= deltaVertical;
                        break;
                    case VerticalAlignment.Top:
                        deltaVertical = Math.Min(e.VerticalChange, designerItem.ActualHeight - designerItem.MinHeight);
                        Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + deltaVertical);
                        designerItem.Height -= deltaVertical;
                        break;
                    default:
                        break;
                }

                switch (HorizontalAlignment)
                {
                    case HorizontalAlignment.Left:
                        deltaHorizontal = Math.Min(e.HorizontalChange, designerItem.ActualWidth - designerItem.MinWidth);
                        Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + deltaHorizontal);
                        designerItem.Width -= deltaHorizontal;
                        break;
                    case HorizontalAlignment.Right:
                        deltaHorizontal = Math.Min(-e.HorizontalChange, designerItem.ActualWidth - designerItem.MinWidth);
                        designerItem.Width -= deltaHorizontal;
                        break;
                    default:
                        break;
                }
            }

            e.Handled = true;
        }
    }

结果:

enter image description here enter image description here