我正在尝试让网格在运行时由用户调整大小。我发现了很多例子,但是它们似乎都是通过使用装饰等来使它变得过于复杂。
然而,我确实找到了一个理想的解决方案:https://resizablegrid.codeplex.com/
它使用拇指,看起来很简单。但是,当我编辑模板(删除除SE中的所有拇指之外的所有拇指)时,它会中断 - 它不再可调整大小(即使我没有对模板进行任何更改也是如此)。
我只想在右下角使用一个简单的控件,例如拇指或ResizeGrip,这样可以让用户调整面板的大小。
即使替代解决方案有点复杂,我仍然想知道所涉及的步骤。
答案 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;
}
}
结果: