2009-12-04 38 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

相關問題