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}”
这样的东西应用于整个控件,并影响标签和编辑器,而在当前方法中,您需要设置两次。