2013-07-31 3 views
0

Есть ли способ предотвратить использование панели обертки (или другого элемента управления) в вычислении ширины прокрутки? Например, ниже, я бы хотел, чтобы панель обхода оставалась в пределах ширины, созданной другими элементами управления, но не влияла непосредственно на вычисление ширины. (т. е.) Я бы хотел, чтобы поведение было похоже на то, что Auto был выключен, но все же позволяет горизонтальную прокрутку другого контента расширяться.WPF не контролирует влияние ширины scrollviewer?

<Window x:Class="MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="100" /> 
       <ColumnDefinition Width="1*" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 
      <WrapPanel Grid.Column="1" Name="ctlWrap" /> 
      <TextBox Grid.Row="1" Grid.Column="1" Width="100" HorizontalAlignment="Left" Name="ctlText" /> 
      <StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal"> 
       <Button Click="Button_Click">Add Wrap</Button> 
       <Button Click="Button_Click_1">Remove Wrap</Button> 
       <Button Click="Button_Click_2">Add Text</Button> 
       <Button Click="Button_Click_3">Remove Text</Button> 
      </StackPanel> 
     </Grid> 
    </ScrollViewer> 
</Grid> 
</Window> 

Вот код, который я использовал для кнопок:

Class MainWindow 

Private Sub Button_Click(sender As Object, e As RoutedEventArgs) 
    ctlWrap.Children.Add(New Button With {.Content = "Button " & ctlWrap.Children.Count + 1}) 
End Sub 

Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs) 
    If ctlWrap.Children.Count Then 
     ctlWrap.Children.RemoveAt(ctlWrap.Children.Count - 1) 
    End If 
End Sub 

Private Sub Button_Click_2(sender As Object, e As RoutedEventArgs) 
    ctlText.Width += 30 
End Sub 

Private Sub Button_Click_3(sender As Object, e As RoutedEventArgs) 
    If ctlText.Width > 60 Then ctlText.Width -= 30 
End Sub 
End Class 
+0

Ваш вопрос непонятен ... похоже, вам, возможно, понадобится разработать свою собственную «панель», но я не совсем уверен в том, чего вы хотите. – Sheridan

+0

Я бы хотел, чтобы оберточная панель имела размер до эффективного размера скроллера, не влияя на ширину скроллеров. Есть два условия: 1) все другое содержимое вписывается в пространство просмотра. Панель обертки должна быть шириной пространства просмотра. 2) Некоторый другой контент шире пространства просмотра, скроллер позволяет прокручивать эту ширину. Оберточной панелью должна быть новая ширина. т. е. он имеет размеры до ширины скроллеров, но не влияет на ширину скроллеров. В моем сценарии панель обертки находится во втором столбце сетки, которая находится в скроллере. – user2637281

ответ

1

я слегка капитулировал. Я помещал кнопки в левый столбец сетки, а затем привязывал ширину и ширину к ширине видового экрана скроллера, а левое поле - к горизонтальному смещению.

<Window x:Class="MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:app="clr-namespace:WpfApplication14" 
Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <app:MarginConverter x:Key="mc" /> 
</Window.Resources> 
<Grid> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" Name="ctlScroll"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="100" /> 
       <ColumnDefinition Width="1*" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 
      <WrapPanel Grid.ColumnSpan="2" Grid.Column="0" Name="ctlWrap" Width="{Binding ViewportWidth, ElementName=ctlScroll}" MaxWidth="{Binding ViewportWidth, ElementName=ctlScroll}" Margin="{Binding HorizontalOffset, ElementName=ctlScroll, Converter={StaticResource mc}}" HorizontalAlignment="Left" /> 
      <TextBox Grid.Row="1" Grid.Column="1" Width="100" HorizontalAlignment="Left" Name="ctlText" /> 
      <StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal"> 
       <Button Click="Button_Click">Add Wrap</Button> 
       <Button Click="Button_Click_1">Remove Wrap</Button> 
       <Button Click="Button_Click_2">Add Text</Button> 
       <Button Click="Button_Click_3">Remove Text</Button> 
      </StackPanel> 
     </Grid> 
    </ScrollViewer> 
</Grid> 
</Window> 

Конвертер величин прибыл из here.

+0

ViewportWidth привязка - путь. Спасибо за это. – johnDisplayClass

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