2012-03-15 81 views
6

我有一個ScrollViewer,當列表中有足夠的對象時,它出現在右側。我怎樣才能讓它出現在左邊?如何使隱式滾動查看器顯示在左側而不是右側

<ListBox 
x:Name="MessageListBox" 
BorderThickness="0" 
ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
HorizontalContentAlignment="Stretch" 
AlternationCount="2" 
ItemContainerStyle="{StaticResource AltStyle}" 
SelectionMode="Extended" 
> 
<ListBox.ItemTemplate > 
    <DataTemplate> 
    <!-- button --> 
<!-- closing tags --> 
+1

我要提醒這個移動到另一側。正常的執行是正確的,左側可能會混淆/刺激你的用戶。 – tsells 2012-03-15 16:20:28

回答

3

這是通過修改ListBox的ScrollViewer的模板來完成的。

首先修改Container Grid的ColumnDefinitions。然後,把東西放到正確的列中。

玩得開心!

<!--This should be able to be placed on any WPF Window for testing purposes--> 
<ListBox Height="85" VerticalAlignment="Top" Margin="117,110,300,0"> 
    <ListBox.Template> 
     <ControlTemplate TargetType="{x:Type ListBox}"> 
      <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true"> 
       <ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}"> 
        <ScrollViewer.Template> 
         <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
          <Grid x:Name="Grid" Background="{TemplateBinding Background}"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="*"/>      
           </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="*"/> 
            <RowDefinition Height="Auto"/> 
           </Grid.RowDefinitions> 
           <Rectangle x:Name="Corner" Grid.Column="0" Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" Grid.Row="1"/> 
           <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="False" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="1" Margin="{TemplateBinding Padding}" Grid.Row="0"/> 
           <ScrollBar x:Name="PART_VerticalScrollBar" AutomationProperties.AutomationId="VerticalScrollBar" Cursor="Arrow" Grid.Column="0" Maximum="{TemplateBinding ScrollableHeight}" Minimum="0" Grid.Row="0" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/> 
           <ScrollBar x:Name="PART_HorizontalScrollBar" AutomationProperties.AutomationId="HorizontalScrollBar" Cursor="Arrow" Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0" Orientation="Horizontal" Grid.Row="1" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/> 
          </Grid> 
         </ControlTemplate> 
        </ScrollViewer.Template> 
        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </ScrollViewer> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsEnabled" Value="false"> 
        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
       </Trigger> 
       <Trigger Property="IsGrouping" Value="true"> 
        <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </ListBox.Template> 
    <TextBox Text="Hi Mom!"/> 
    <TextBox Text="Hi Dad!"/> 
    <TextBox Text="Hi Father!"/> 
    <TextBox Text="Hi Mother!"/> 
    <TextBox Text="Hi Padre!"/>    
</ListBox> 

p.s.如果你想移動Horizo​​ntalScrollBar,只需重新排序RowDefinitions,就可以做相同的練習(將每個子組件放在適當的行中)

+0

滾動條出現,但它滾動它不滾動我的數據 – 0x4f3759df 2012-03-15 16:04:56

+0

是的,我注意到你正在使用一個列表框,並正確地編輯帖子,你會想確保它使用之前的itemspresenter。 – Jeremiah 2012-03-15 16:07:21

+0

現在我看到你在WPF中......更多的變化即將到來。 – Jeremiah 2012-03-15 16:11:21

9

它可以通過將列表包裝到ScrollViewer中並將ScrollViewer屬性FlowDirection更改爲「右到左」。另外,不要忘記將'FlowDirection'列表恢復到LeftToRight,否則它會繼承父母的方向。

<ScrollViewer FlowDirection="RightToLeft" 
    CanContentScroll="False" VerticalScrollBarVisibility="Auto"> 
    <ListBox ItemsSource="{Binding CustomItems}" FlowDirection="LeftToRight"/> 
</ScrollViewer> 

我發現它在MSDN博客社會, http://social.msdn.microsoft.com/Forums/vstudio/en-US/e796231d-5c92-44b4-bb7e-c3b74d81a99c/how-to-set-verticalscroll-bar-on-left-side?forum=wpf

+0

這將顛倒SrollViewer中的任何控件的內容。所以如果你不考慮這個因素,它可能會產生巨大的不利影響。 – claudekennilol 2015-04-29 17:38:22

+2

@claudekennilol - 實際上,這是完美的,因爲他們將FlowDirect設置回列表框中的LeftToRight。如果有很多物品,你也可以將它們全部包裝在網格中。 – 2015-07-20 18:29:05

+1

@AnonyNichols對,應該指出這個*這個例子是這樣做的,但是指出一個不知道它會做什麼的人是很好的。 – claudekennilol 2015-07-21 15:43:30

0

簡單的ListBox的嵌入式的ScrollViewer設置爲從右至左:

<ListBox ScrollViewer.FlowDirection="RightToLeft" /> 
相關問題