gpt4 book ai didi

c# - 更改网格坐标系

转载 作者:太空狗 更新时间:2023-10-29 21:46:16 26 4
gpt4 key购买 nike

WPF中的网格目前有这样的网格系统:

    Cols
+ + + + +
| 0 | 1 | 2 | 3 |
+--+---|---|---|---|---
0 | | | | |
+--+---|---|---|---|--- Rows
1 | | | | |
+--+---|---|---|---|---
2 | | | | |
+--+---|---|---|---|---

有没有办法让它表现得像这样:

    Cols
+ + + + +
| 0 | 1 | 2 | 3 |
+--+---|---|---|---|---
2 | | | | |
+--+---|---|---|---|--- Rows
1 | | | | |
+--+---|---|---|---|---
0 | | | | |
+--+---|---|---|---|---

理想情况下,我希望 RowSpan 向上而不是向下扩展项目。

例子:

我的数据源在 map 上将立方体存储为 0,0,目的是将其显示在左下角。然而,WPF 中的网格会将立方体放在左上角。另一个问题是数据源给我一个 2x2 的位置,左下角的“ anchor ”位置具有宽度和高度。宽度和高度绑定(bind)到 ColSpan 和 RowSpan。 RowSpan 是一个问题,因为它将在网格中向下扩展而不是向上扩展。

最佳答案

您应该能够执行此操作,而无需使用附加属性创建自定义控件或用户控件。

这是一个我认为应该能够做你想做的事情的类。不是将 Grid.RowGrid.RowSpan 的值绑定(bind)到您的行和高度,而是绑定(bind) GridEx.RowFromBottomGridEx。 RowSpanFromBottom 给他们。这些属性的属性更改处理程序将根据这些属性的值和网格中的行数计算 Grid.Row 的新值。

一个潜在的问题是,如果您在运行时从网格中添加或减去行,这可能无法正确更新。

public static class GridEx
{
public static readonly DependencyProperty RowFromBottomProperty = DependencyProperty.RegisterAttached("RowFromBottom", typeof(int?), typeof(GridEx), new FrameworkPropertyMetadata(default(int?), FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange | FrameworkPropertyMetadataOptions.AffectsParentArrange | FrameworkPropertyMetadataOptions.AffectsParentMeasure, OnRowFromBottomChanged));
public static readonly DependencyProperty RowSpanFromBottomProperty = DependencyProperty.RegisterAttached("RowSpanFromBottom", typeof(int?), typeof(GridEx), new FrameworkPropertyMetadata(default(int?), FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange | FrameworkPropertyMetadataOptions.AffectsParentArrange | FrameworkPropertyMetadataOptions.AffectsParentMeasure, OnRowSpanFromBottomChanged));

private static void OnRowFromBottomChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var grid = GetContainingGrid(d);
int? rowFromBottom = (int?) e.NewValue;
int? rowSpanFromBottom = GetRowSpanFromBottom(d);
if (rowFromBottom == null || rowSpanFromBottom == null) return;
int rows = grid.RowDefinitions.Count;
int row = Math.Max(0, Math.Min(rows, rows - rowFromBottom.Value - rowSpanFromBottom.Value));
Grid.SetRow((UIElement) d, row);
}

private static void OnRowSpanFromBottomChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var grid = GetContainingGrid(d);
int? rowFromBottom = GetRowFromBottom(d);
int? rowSpanFromBottom = (int?)e.NewValue;
if (rowFromBottom == null || rowSpanFromBottom == null) return;
int rows = grid.RowDefinitions.Count;
int row = Math.Max(0, Math.Min(rows, rows - rowFromBottom.Value - rowSpanFromBottom.Value));
Grid.SetRow((UIElement)d, row);
Grid.SetRowSpan((UIElement)d, rowSpanFromBottom.Value);
}

public static int? GetRowFromBottom(DependencyObject obj)
{
return (int?) obj.GetValue(RowFromBottomProperty);
}

public static void SetRowFromBottom(DependencyObject obj, int? value)
{
obj.SetValue(RowFromBottomProperty, value);
}

public static int? GetRowSpanFromBottom(DependencyObject obj)
{
return (int?)obj.GetValue(RowSpanFromBottomProperty);
}

public static void SetRowSpanFromBottom(DependencyObject obj, int? value)
{
obj.SetValue(RowSpanFromBottomProperty, value);
}

private static Grid GetContainingGrid(DependencyObject element)
{
Grid grid = null;
while (grid == null && element != null)
{
element = LogicalTreeHelper.GetParent(element);
grid = element as Grid;
}
return grid;
}
}

如果您对这里发生的事情有任何疑问,请随时提问。

关于c# - 更改网格坐标系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10035546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com