41

まだWPFをいじくり回して、学習しながら進んでいます。コントロールの動的なグループ化を構築しようとしています(主にボタンですが、チェックボックスなどが含まれる場合があります)。

これを行うための最良の方法がわからなかったので、ItemsControlスタイルを作成してから、WrapPanel内のItemsPresenterにアイテムを追加してみました。すぐに、ItemsHostとして配置しない限り、アイテムがWrapPanel内に効果的に含まれていなかったため、アイテムがラップされないことに気付きました。このような:

<Style x:Key="ButtonPanelGroup" TargetType="{x:Type ItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ItemsControl}">
                <Border CornerRadius="5"
                        BorderBrush="{StaticResource DarkColorBrush}"
                        BorderThickness="1"
                        Margin="5">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>

                        <WrapPanel IsItemsHost="True" FlowDirection="LeftToRight">
                            <ItemsPresenter />
                        </WrapPanel>

                        <ContentPresenter ContentSource="Name" Grid.Row="1" />

                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

これは進行中の作業であり、まだ実装する必要のある多くのスタイリング効果があることに注意してください。ここで私はそれを使用します:

<UniformGrid Rows="1">
    <ItemsControl Name="Group1" Style="{StaticResource ButtonPanelGroup}">
        <Button>Button1</Button>
        <Button>Button2</Button>
        <CheckBox>TickBox</CheckBox>
    </ItemsControl>

    <ItemsControl Name="Group2" Style="{StaticResource ButtonPanelGroup}">
        <Button>Button3</Button>
        <Button>Button4</Button>
        <Button>Button5</Button>
    </ItemsControl>

    <ItemsControl Name="Group3" Style="{StaticResource ButtonPanelGroup}">
        <Button>Button6</Button>
        <Button>Button7</Button>
        <Button>Button8</Button>
    </ItemsControl>
</UniformGrid>

また、UniformGridはここに行く方法ではなく、マージンが苦痛になる可能性があるため(重複するマージンはありますか?)、まだ作業中であることに注意してください。そこで入力していただければ幸いです。

さて、本当の問題に。これは機能しませんエラーが発生します:

「ItemsPresenter」オブジェクトを「WrapPanel」に追加することはできません。ItemsControlのItemsPanelとして使用されるPanelのChildrenコレクションを明示的に変更することはできません。ItemsControlは、Panelの子要素を生成します。オブジェクト'System.Windows.Controls.ItemsPresenter'でエラーが発生しました。

したがって、このようなことを行うための最良の方法は何ですか(ボタンやその他のコントロールをItemControlにスローして、本当に素晴らしいものに並べることができるようにしたいと思います)。コントロールをある種のコレクションに入れて反復する方がよいでしょうか。

それをうまくやりたいのですが、私のWPFスキルはまだ不足しています。基本を超えて教え、プロが実際にそれをどのように行うかを示すWPFの本はありますか?

4

3 に答える 3

59

ItemsPanelプロパティを確認することをお勧めします。

アイテムのレイアウトを制御するパネルを定義するテンプレートを取得または設定します。

例:

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

そして、あなたはそれを次のようにスタイルに設定することができます:

<Style TargetType="ItemsControl">
    <Setter Property="ItemsPanel">
      <Setter.Value>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>
于 2010-06-28T11:35:50.907 に答える
6

手がかりプロパティIsItemsHost="True"の定義を忘れないでください。そうしないと、ItemsControlにアイテムが表示されません。

<ListBox ItemsSource="{Binding MyItemsSource}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate >
                <WrapPanel IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ListBox>
于 2016-03-08T11:06:08.007 に答える
1

これは、DataGrid /xceeddatagridおよびWrapPanelソリューションを遅くするためのもう1つの簡単な代替手段です。大量のデータまたはテーブル全体が編集専用の場合に役立つことがあります。ItemsControl + Grid.IsSharedSizeScope="True"を使用する

詳細はこちら:https : //wpf.2000things.com/tag/issharedsizescope/ +パフォーマンスのためのItemsControlの仮想化について:ItemsControlの仮想化?

<Grid Grid.IsSharedSizeScope="True" Margin="0,30,0,0">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Id" />
            <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Time"  />
        </Grid.ColumnDefinitions>
        <Border Grid.Column="0" >
            <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="Header1" />
        </Border>
        <Border Grid.Column="1" >
            <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="Header2" />
        </Border>
    </Grid>

    <ItemsControl Grid.Row="1" ItemsSource="{Binding RunInstance.ConcentrationGradient.Steps}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Id" />
                        <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Time" />
                    </Grid.ColumnDefinitions>
                    <Border Grid.Column="0">
                        <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="{Binding Index, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
                    </Border>
                     <Border Grid.Column="1">
                        <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="{Binding Time, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
                    </Border>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>
于 2018-07-26T11:22:01.940 に答える