Wpf 电网自动化

Wpf 电网自动化,wpf,grid,attached-properties,Wpf,Grid,Attached Properties,我想从网格控件派生出来,这样我就可以以一种特定的方式自动化子控件的布局,我想知道什么是最好的方法 我希望能够做到的是: <l:CustomGrid> <Label Content="PropA" Grid.ColumnSpan="89"/> <TextBox /> <Label Content="PropB"/> <Slider /> <!

我想从网格控件派生出来,这样我就可以以一种特定的方式自动化子控件的布局,我想知道什么是最好的方法

我希望能够做到的是:

    <l:CustomGrid>
        <Label Content="PropA" Grid.ColumnSpan="89"/>
        <TextBox />

        <Label Content="PropB"/>
        <Slider />

        <!-- this needs to span 2 columns -->
        <Label Content="Span" l:CustomGrid.SpanRow="True"
               HorizontalAlignment="Center" />

        <Label Content="PropC"/>
        <CheckBox />
    </l:CustomGrid>

其中,自定义网格将自动将其布局为2列网格,有N行,方法是让每个偶数子元素为列0,每个奇数子元素为列1,然后在每个奇数子元素之后添加新行。通过重写OnVisualChildrenChanged以执行网格连接属性的逻辑/设置,这非常容易

但是,此时似乎尚未设置附加属性,因此尚未应用自定义的SpanRow属性,这意味着我无法执行需要的逻辑


所以我想知道我怎么能用另一种方式去做呢?

不同的方式是不从网格中进行黑客攻击或派生


侦听加载的事件和VisualChildrenChanged,以防在加载网格后在运行时更改子集合。在这两种情况下,您都必须执行与所述相同的逻辑,该逻辑将在子对象中运行,并更改或向附加的Grid.Column属性应用新值。

我通过创建一个名为
LabeledEditor
的可重用用户控件解决了这一问题,该控件基本上定义了一个标签和一个放置编辑器的
ContentPresenter
,所以你可以在里面放任何用户界面。我认为这比你所说的黑客要容易得多。你是说基本上是一个HeaderContentControl?我已经尝试过这种方法,通过覆盖模板来使用宽度共享的网格,以便所有标签对齐,但是在xaml中使用它变得非常冗长。我认为您当前的方法更加冗长。我的方法统一了标签和编辑器,因此像
Visibility=“{Binding Something}”
这样的东西应用于整个控件,并影响标签和编辑器,而在当前方法中,您需要设置两次。