WPF мешает контролировать ширину прокрутки?
Есть ли способ предотвратить участие панели переноса (или другого элемента управления) в расчете ширины прокрутки? Например, ниже я бы хотел, чтобы панель переноса оставалась в пределах ширины, созданной другими элементами управления, но не оказывала прямого влияния на вычисление ширины. (то есть) Мне бы хотелось, чтобы поведение было таким же, как если бы Авто было отключено, но при этом горизонтальная прокрутка другого контента стала бы шире.
<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
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>
Конвертер маржи пришел отсюда.