39

ItemsControl を含むスタック パネルの周りに scrollviewer コントロールを使用しています。ItemsControl に多くのアイテムがある場合、スクロールするはずですが、何らかの理由でアイテムが切り捨てられます。コードは次のとおりです。

<StackPanel>
    <ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Visible">
        <ItemsControl  Name="icEvents" Width="Auto" Height="100"  Background="AliceBlue" 
                       ItemsSource="{Binding Path=EventSources}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="Source:"/>
                        <TextBlock Text="{Binding Path=Source}" />
                        <TextBlock Text="Original Source:"/>
                        <TextBlock Text="{Binding Path=OriginalSource}" />
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>
</StackPanel>
4

5 に答える 5

55

ScrollViwerの代わりにあなたの周りにグリッドを試してみてくださいStackPanelStackPanel内部コンテンツが必要とするだけの高さを提供すると思いますがScrollviwer、親コントロールによって高さが制限されていないため、ここでは適切に機能しません。

以下の例から問題を理解できます。

<StackPanel>
    <ScrollViewer>
        <ItemsControl >
            <Rectangle Stroke="#FFC3C3C3"  Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
            <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
            <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
            <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
            <Rectangle Stroke="#FFC3C3C3"  Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
        </ItemsControl>
    </ScrollViewer>
</StackPanel>

上記のコードはあなたのものに似ており、スクロールバーを提供しません。ただし、以下のコードを参照してください。このコードでは、 のみStackPanelを aに変更しましたGrid(パネルのサイズに基づいて子のサイズを尊重するが、stackpanel は考慮しないパネル)。

<Grid>
    <ScrollViewer>
        <ItemsControl >
            <Rectangle Stroke="#FFC3C3C3"  Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
            <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
            <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
            <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
            <Rectangle Stroke="#FFC3C3C3"  Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
        </ItemsControl>
    </ScrollViewer>
</Grid>

UPDATE:しかし、本当に使用する必要がある場合は、コンテンツスクロールを取得するためStackPanelにサイズを設定する必要があるかもしれませんScrollViwer

于 2009-07-15T18:10:18.070 に答える
30

Scrollviewer の Height を修正する必要がありますが、StackPanel ActualHeight に簡単にバインドできます:
(テスト済みコード)

<StackPanel Name="mypanel">
   <ScrollViewer Height="{Binding ElementName=mypanel, Path=ActualHeight}">
       <ItemsControl>
          <Rectangle Stroke="#FFC3C3C3"  Height="300" Fill="Black" Width="200"/>
          <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
          <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/>
          <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
          <Rectangle Stroke="#FFC3C3C3"  Width="200" Height="300" Fill="Black" />
      </ItemsControl>
   </ScrollViewer>
</StackPanel>

または、StackPanel の名前を変更できない場合:

<StackPanel>
    <ScrollViewer Height="{Binding RelativeSource={RelativeSource FindAncestor, 
                        AncestorType={x:Type StackPanel}}, Path=ActualHeight}">
       <ItemsControl>
          <Rectangle Stroke="#FFC3C3C3"  Height="300" Fill="Black" Width="200"/>
          <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
          <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/>
          <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" />
          <Rectangle Stroke="#FFC3C3C3"  Width="200" Height="300" Fill="Black" />
      </ItemsControl>
   </ScrollViewer>
</StackPanel>

これは「あなたが最初」の問題です。StackPanel は ScrollViewer に Height を要求し、ScrollViewer は StackPanel に可能な最大の Height を要求します。

于 2009-07-15T18:49:51.860 に答える
3

には、ItemsControlを含める必要がありますがScrollViewer、その逆ではありません。あなたの場合、ScrollViewer知っているのはItemsControlそれ自体だけです-それは内部のアイテムについては知りません。

次のようなものを試してください。

<ItemsControl Name="icEvents" Width="Auto" Height="100"
    Background="AliceBlue"
    ItemsSource="{Binding Path=EventSources}">
    <ItemsControl.ItemTemplate>
        <DataTemplate> 
            <StackPanel>
                <TextBlock Text="Source:"/>
                <TextBlock Text="{Binding Path=Source}" />
                <TextBlock Text="Original Source:"/>
                <TextBlock Text="{Binding Path=OriginalSource}" />
            </StackPanel>  
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <ItemsPresenter Margin="5" />
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>
于 2009-07-15T18:10:08.073 に答える
0

グリッドに を表示するという問題がありItemsControl、スクロールバーを表示するには、このグリッド セルに * サイズの高さを指定する必要がありました。

ただし、これはItemsControl、少数の値しかない場合でも、常にセルがいっぱいになることを意味していました。

ItemsControl何を持っているかを示すのに十分な大きさにしたかったのですが、アイテムが多すぎる場合はスクロールしたかったのです。言い換えれば、これが任意のサイズのモニターでのみ機能するようにしたかったのです。

Loaded イベントのこのコードは私にとってはうまくいきました:

Size x = new Size(double.PositiveInfinity, double.PositiveInfinity);
myItemscontrol.Measure(x);
于 2014-04-27T18:49:49.407 に答える
0

Scroll はサイズ変更する子の親である必要があるため、サイズ変更コントロール (この例ではスタック パネル) をその中に配置します。

<ScrollViewer>
    <StackPanel>
         <Rectangle Stroke="#FFC3C3C3"  Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
         <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
         <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/>
         <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
         <Rectangle Stroke="#FFC3C3C3"  Width="200" Height="300" Fill="Black" StrokeThickness="4"/>
    </StackPanel>

于 2012-03-19T17:37:39.987 に答える