2016-04-12 4 views
0

У меня есть StackPanel, который заполняется пользовательскими UserControls. Я хотел бы включить горизонтальную полосу прокрутки в нижней части этой панели стека, которая позволяет пользователям просматривать прокрутку влево или вправо, чтобы просмотреть больше пользовательских элементов управления.HorizontalScrollBar на StackPanel

То, что у меня сейчас, пока оно работает, кажется неправильным в том смысле, что размер элемента ItemsPanel определяется ScrollViewer. Я имею в виду, что если я отрегулирую вертикальную полосу прокрутки и сжимаю ее, это также сжимает панель стека, и для ее просмотра мне нужно прокрутить вниз. Я попытался поместить ScrollViewer внутри элемента ItemsControl, но это не работает.

<Window x:Name="MainWindow" x:Class="Test.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Test Generator" Height="464.5" Width="950"> 
<Grid> 
    <Menu DockPanel.Dock="Top" Height="22" VerticalAlignment="Top"> 
     <MenuItem Header="_File"> 
      <MenuItem Header="New"/> 
      <MenuItem Header="Open Template"/> 
      <MenuItem Header="Save Template"/> 
      <Separator /> 
      <MenuItem Header="_Exit"/> 
     </MenuItem> 
    </Menu> 
    <Button Content="Load Template" HorizontalAlignment="Left" Margin="35,36,0,0" VerticalAlignment="Top" Width="98"/> 
    <Button Content="Add Col" HorizontalAlignment="Right" Margin="0,36,35,0" VerticalAlignment="Top" Width="75"/> 
    <Button x:Name="Generate_Data" Content="Generate Data Window" Height="22" Margin="0,36,0,0" VerticalAlignment="Top" Width="160" Click="Generate_Data_Click" HorizontalAlignment="Center"/> 
     <ScrollViewer HorizontalScrollBarVisibility="Visible" Margin="0,197,0,0"> 
      <ItemsControl Name="userControlContainer" Margin="10,150,10,10" ItemsSource="{Binding MyCollection}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <ContentControl Content="{Binding}" /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </ScrollViewer> 
</Grid> 

ответ

3

Удалить внешний ScrollViewer у вас есть, и добавить его в ControlTemplate самого ItemsControl.

<ItemsControl Name="userControlContainer" Margin="10,150,10,10" ItemsSource="{Binding MyCollection}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.Template> 
     <ControlTemplate> 
      <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled"> 
       <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"/> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ItemsControl.Template> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ContentControl Content="{Binding}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

Это прекрасно работает, как мне нужно. Могу ли я спросить, где вы получили эту информацию, если вы посмотрели ее где-то в Интернете? –

+1

У меня была аналогичная проблема, когда я впервые начал работать с custom ItemsControl, это был метод, который я придумал. Я посмотрел шаблон DefaultControl по умолчанию и увидел, как работает встроенный Scroll. Я не могу вспомнить, где, но я считаю, что использовал это как источник: https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemcontainerstyle(v=vs.110). ASPX –

0

Попытка удалить внешний <ScrollViewer/> и установить вложенное свойство из <StackPanel ScrollViewer.HorizontalScrollBarVisibility="Auto" />.

Полный пример:

<ItemsControl Name="userControlContainer" Margin="10,150,10,10" ItemsSource="{Binding MyCollection}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" ScrollViewer.HorizontalScrollBarVisibility="Auto"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <ContentControl Content="{Binding}" /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

Это не работает. Я попробовал Visible вместо Auto. –

+0

@ TalenKylon не могли бы вы написать больше, что хотите. Вы хотите изменить размер только элементов, помещенных в ''? – StepUp

+0

Я не хочу менять их обязательно, я хочу горизонтальную полосу прокрутки, которая позволит мне посмотреть на их больше, если количество элементов в StackPanel превышает представление приложения. Затем прокрутите влево или вправо, чтобы увидеть больше. –

 Смежные вопросы

  • Нет связанных вопросов^_^