0

我正在使用停靠面板来显示从 itemsource 读取并希望水平显示它们但它垂直显示它们的按钮列表。

我正在使用以下代码:

<DockPanel Name="DockPanel2"  Grid.Row="1"   Visibility="Visible">
            <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="260,50,0,0">
                <ItemsControl ItemsSource="{Binding PageViewModels}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Button Foreground="MidnightBlue"
                            Content="{Binding Name}" Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                                CommandParameter="{Binding }"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
           <ContentControl  Content="{Binding CurrentPageViewModel}"/>
        </DockPanel>

如果我使用以下代码(将按钮作为静态列表,我可以以水平方式显示列表。

 <DockPanel Name="DockPanel2"  Grid.Row="1"   Visibility="Visible">
            <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="260,50,0,0">
                <Button Content="Button 1" Margin="2" />
                <Button Content="Button 2" Margin="2" />
                <Button Content="Button 3" Margin="2" />
                <Button Content="Button 4" Margin="2" />
                <Button Content="Button 5" Margin="2" />
            </StackPanel>

            <ContentControl  Content="{Binding CurrentPageViewModel}" />
        </DockPanel>

有人可以告诉我哪里出错了。

谢谢,

4

5 回答 5

1

您应该使用 ItemControl 的属性 ItemsPanelTemplate 并在其中放置一个 StackPanel。

类似于以下内容:

<DockPanel Name="DockPanel2"  Grid.Row="1"   Visibility="Visible">
            <ItemsControl ItemsSource="{Binding PageViewModels}"
                          DockPanel.Dock="Top">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Button Foreground="MidnightBlue"
                        Content="{Binding Name}" Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                            CommandParameter="{Binding }"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
       <ContentControl  Content="{Binding CurrentPageViewModel}"/>
    </DockPanel>

请注意,我已经删除stackPaneldockPanel.

于 2015-04-21T12:20:47.383 回答
0

问题是 anItemsControl不会在 中生成单独的项目,它会在它自己的“面板”中生成项目,StackPanel因此您必须StackPanelItemsPanel

一旦我自己尝试过,我将为您提供一些示例代码。

编辑:我只是讨厌你们只是把其他答案当作自己的答案,我想我不需要添加示例代码......

于 2015-04-21T12:13:59.360 回答
0

您需要将 ItemsControl 的 ItemsPanelTemplate 指定为水平方向的 StackPanel。您所拥有的只是一个托管 ItemsControl 的 StackPanel - 它是水平方向的这一事实在这里没有任何意义。所以试试这个:

<ItemsControl ItemsSource="{Binding PageViewModels}">
        <ItemsControl.ItemPanelTemplate>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
       </ItemsControl.ItemPanelTemplate>

       <ItemsControl.ItemTemplate ... your existing xaml >
</ItemsControl>
于 2015-04-21T12:18:10.350 回答
0

您必须设置StackPanelas ItemsPanel of ItemsControl

例子:

    <ItemsControl ....>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation ="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button .... />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
于 2015-04-21T12:19:54.883 回答
0

我发现你可以创建你想要的元素将它添加到列表中,然后使用 VirtualizingStackPanel。

我在 foreach 循环中使用它来将我的枚举转换为按钮列表。

foreach (MyEnum myenum in(MyEnum[])Enum.GetValues(typeof(MyEnum))){
    Button btn = new Button();
        btn.Name = "This Is Optional";
        btn.Content = "Content";
        btn.Click += CustomCommand;
        btn.CommandParameter = myenum;
        buttonlist.Add(temp);
}

我将按钮列表存储在 ObservableCollection 中。

public ObservableCollection<Button> buttonlist = new ObservableCollection<Button>();

这是我可以根据 Enum 值执行命令的基本方式。

private void CustomCommand(object sender, RoutedEventArgs e)
{
    MyEnum parameter = (MyEnum)(sender as Button).CommandParameter;
}

然后使用 VirtualizingStackPanel 将它们全部添加到您的视图中。

<ItemsControl ItemsSource="{Binding buttonlist}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

只需共享它,因为它看起来是动态的,您可以将它用于任何 WPF 元素,您甚至可以制作混合对象列表,VirtualizingStackPanel 会处理它。

于 2019-10-22T23:50:00.013 回答