2009-12-04 75 views
2

我有一个ListBox,它的模板中有一个网格以允许4列。一列是ListBox的实际文本。我想要该列填充可用的水平空间。WPF布局 - 获得一列以填充可用空间

列定义是:

<ControlTemplate TargetType="ListBoxItem"> 
    <Grid ScrollViewer.CanContentScroll="True" Margin="2"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="20" /> 
      <ColumnDefinition Width="50" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="30" /> 
     </Grid.ColumnDefinitions> 
     <CheckBox VerticalAlignment="Center" Grid.Column="0" IsChecked="{Binding IsSelected, 
        RelativeSource={RelativeSource TemplatedParent}, 
        Mode=TwoWay}" /> 
     <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="{Binding Id}" /> 
     <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="{Binding Title}" /> 
     <Button HorizontalAlignment="Right" Grid.Column="3" Tag="{Binding Id}" Margin="5,0,5,0">-&gt;</Button> 
    </Grid> 
</ControlTemplate> 

我已经试过这几个排列并没有什么会让它在窗口解决,除了明确的大小设置。然后,当我调整窗口大小时,它不会调整大小。

ListBox被包裹在一个ScrollViewer允许垂直滚动(我猜那是什么是搞乱了我。)

如何获得第三列,以填补刚刚可用的空间和任何想法没有更多?

回答

0

我终于明白了这一点。

设置水平滚动条来禁用这样所需的含有列表框:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 

一旦我做到了网格的大小非常。

其中一天,我会弄清楚所有这些“声明性的东西”是如何工作的。

+0

该修复与“声明性”无关。 Xaml是声明式的。您的问题是流量问题,因为您的解决方案显示您禁用了控件的水平流动行为。 – 2009-12-10 03:18:30

+0

不太清楚你的意思。你是否说我的修复方法是错误的?我正在使用声明式XAML属性来获取我需要的解决方案。无论哪种方式,没有其他方式来做到这一点。 – Vaccano 2009-12-10 15:27:28

0

是的我会建议滚动查看器搞砸你,你可以将网格的宽度绑定到父对象的实际宽度,所以有一个定义的大小*必须填写。

1

您是否需要ListBox的控制行为,还是仅将它用于布局?

如果您仅用于布局,则可以将ListBox替换为ScrollViewer中的ItemsControl

此代码(屠宰的设计工作)显示此:

<ScrollViewer> 
    <ItemsControl> 
     <!--<ListBox>--> 
     <Grid Margin="2"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="20" /> 
       <ColumnDefinition Width="50" /> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="30" /> 
      </Grid.ColumnDefinitions> 

      <CheckBox VerticalAlignment="Center" Grid.Column="0" IsChecked="True" /> 
      <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="Id" /> 
      <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="Title" /> 
      <Button HorizontalAlignment="Right" Grid.Column="3" Margin="5,0,5,0">-&gt;</Button> 
     </Grid> 
     <!--</ListBox>--> 
    </ItemsControl> 
</ScrollViewer> 

ListBox有它的孩子杀死宽一些财产,就像一个TreeView一样。所以如果你可以避免使用它,只是出于布局的原因,这可能是你最快的选择。

否则,您需要将Grid的宽度数据绑定到ListView之外的虚拟对象的宽度,但是当滚动条出现/消失时,混乱派对正在处理宽度更改。

+0

这是一个好主意,但ItemsControl没有SelectionMode或Selection改变的事件。 – Vaccano 2009-12-04 16:31:59

+0

以为你可能想要。 – 2009-12-04 19:20:51

1

为什么你需要将ListBox包装在ScrollViewer中?当其内容不适合可用空间时,ListBox自动显示ScrollViewer。你可以从XAML中删除它,它仍然可以正常工作。至少,它为我做了。 :)

我试过你的ControlTemplate,它似乎工作得很好。问题是,当第三列调整到ListBox的宽度时,如果第三列中的文本很长,第四列将不会出现,直到所有文本都可见。

我也尝试了另一种布局方法,我不确定性能方面的问题,但想法是使用DockPanel而不是Grid。我在XAML中最后添加了第三列,以填充剩余空间,并将其停靠在左侧(我将第四列停靠在右侧)。它仍然希望在第三列中显示整个字符串。我不知道为什么会发生这种情况,以及为什么当可用空间不足以显示文本时,文本不会打包或使用省略号。

<Window.Resources> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ListBoxItem"> 
        <DockPanel Width="Auto"> 
         <CheckBox Width="20" VerticalAlignment="Center" DockPanel.Dock="Left" IsChecked="{Binding IsSelected, 
             RelativeSource={RelativeSource TemplatedParent}, 
             Mode=TwoWay}" /> 
         <TextBlock Width="50" VerticalAlignment="Center" DockPanel.Dock="Left" Margin="5,0,5,0" Text="hi" /> 
         <Button Width="30" HorizontalAlignment="Right" DockPanel.Dock="Right" Margin="5,0,5,0">-&gt;</Button> 
         <TextBlock VerticalAlignment="Center" DockPanel.Dock="Left" Margin="5,0,5,0" Text="afdjfksdhahjklfadshjlasffasdlhjsafdlhjasdfasfhdjlaslfhdjsfdhjlsfdlhjsfdhjsfdddsd" TextTrimming="CharacterEllipsis" TextWrapping="WrapWithOverflow" /> 
        </DockPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
+0

这仍然会导致相同的问题。我不希望文字跑出屏幕。它需要截断。 – Vaccano 2009-12-04 17:26:03