5

我有一个 WPF WrapPanel,它包含一些Buttons,我想在运行时重新排列它们。设计时的 XAML 代码如下:

<Grid x:Name="LayoutRoot">
    <WrapPanel Margin="133,127,216,189" Background="#FF979797">
        <Button Content="Button" Width="75"/>
        <Button Content="Button" Width="75"/>
        <Button Content="Button" Width="75"/>
        <Button Content="Button" Width="75"/>
        <Button Content="Button" Width="75"/>
        <Button Content="Button" Width="75"/>
    </WrapPanel>
</Grid>

但是,我想重新安排Buttons运行时。你能帮我解决这个问题吗?

4

2 回答 2

3

你可以这样做:

    <ItemsControl ItemsSource="{Binding Items}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Content="{Binding}" Width="75"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

Items 将是 DataContext 上的一个属性,通常是某种 ObservableCollection。在最简单的情况下,它可能是与按钮标题相对应的字符串集合。当您重新排列 ObservableCollection 元素时,它将重新排列 ItemsControl 中的相应按钮,使用 WrapPanel 来排列它们。


附带说明一下,使用这种方法是朝着所谓的 MVVM 模式 (Model-View-ViewModel) 迈出的一步。这正在迅速成为开发 WPF 应用程序的行业标准模式,并且在它出现时具有很多优势创建灵活、动态的 UI。如果您想做任何重要的 WPF 开发,我强烈建议您研究这种模式。这需要一些时间来适应,但最终还是很值得的。

于 2013-07-09T15:55:53.260 回答
0

如果您想在运行时重新排列子项,您有两个选择,用代码而不是 XAML 创建(或至少操作)WrapPannel 的子项,或者设置触发器(在样式标记中)以根据需要操作按钮.

这是一个例子。

于 2013-07-09T15:48:04.570 回答