【问题标题】:WPF keep control from affecting scrollviewer width?WPF 阻止控制影响滚动查看器的宽度?
【发布时间】:2013-07-31 16:44:20
【问题描述】:

有没有办法防止换行面板(或其他控件)参与滚动查看器宽度计算?例如下面,我希望换行面板保持在其他控件创建的宽度内,但不直接影响宽度计算。 (即)我想要类似于关闭自动的行为,但仍然允许其他内容的水平滚动变宽。

<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

【问题讨论】:

  • 您的问题不清楚...听起来您可能需要开发自己的自定义Panel,但我不确定您想要什么。
  • 我希望将换行面板调整为滚动条的有效大小,而不会影响滚动条的宽度。有两个条件:1)所有其他内容都适合视图空间。环绕面板应该是视图空间的宽度。 2)其他一些内容比视图空间更宽,滚动条允许滚动到该宽度。环绕面板应该是新的宽度。即它的大小与滚动条的宽度一致,但不影响滚动条的宽度。在我的场景中,换行面板位于滚动条中网格的第二列。

标签: wpf layout scrollviewer


【解决方案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

【讨论】:

  • ViewportWidth 绑定是要走的路。谢谢你。
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 2015-09-27
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多