2010-12-23 71 views
20

我的用戶控件中有一個ItemsControl,當它變得太大時(太大則內容比UserControl的可視區域大)。問題在於它所在的網格只是不停地展開,以至於滾動查看器從不會踢入(除非我爲網格指定了精確的高度)。請參閱下面的代碼並提前致謝。防止WPF控件擴展到可視區域

<UserControl x:Class="BusinessObjectCreationWizard.View.TableSelectionPageView" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <GroupBox FontWeight="Bold" Height="300px" 
       Header="Tables" 
       Padding="2"> 

     <ScrollViewer> 

      <ItemsControl FontWeight="Normal" 
          ItemsSource="{Binding Path=AvailableTables}"> 
       <ItemsControl.ItemTemplate> 

        <DataTemplate>    
         <CheckBox Content="{Binding Path=DisplayName}" 
            IsChecked="{Binding Path=IsSelected}" 
            Margin="2,3.5" /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </ScrollViewer> 
    </GroupBox> 
</UserControl> 

這個用戶控件在這裏

<Border Background="White" Grid.Column="1" Grid.Row="0"> 
     <HeaderedContentControl Content="{Binding Path=CurrentPage}" 
           Header="{Binding Path=CurrentPage.DisplayName}" /> 
</Border> 

裝我想不指定高度。

+0

網格的擴展取決於它包含的內容。您需要展示更多的XAML才能獲得準確的答案。 – 2010-12-23 23:12:58

+0

我添加了額外的代碼(雖然格式化出奇) – 2011-01-03 16:33:18

回答

25

如果從GroupBox中刪除高度(據我所知,這是你想要做的),那麼它將填充它的容器,除非有一個面板上游強制其自己的尺寸規則。

我使用了這個簡化版本的XAML。我刪除了模板和綁定,並對一些項目進行了硬編碼,以使其獨立;這些更改不會影響佈局的完成方式。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <GroupBox FontWeight="Bold" Header="Tables" Padding="2"> 
     <ScrollViewer> 
      <ItemsControl FontWeight="Normal"> 
       <TextBlock>Foo</TextBlock> 
       <TextBlock>Bar</TextBlock> 
       <TextBlock>Baz</TextBlock> 
      </ItemsControl> 
     </ScrollViewer> 
    </GroupBox> 
</Window> 

運行它,你將看到的內容確實做大小以適合窗口,當窗口得到太小,看所有三個項目的滾動條僅啓用。我相信這是你想要的。

所以這個問題很可能是其中一個父面板,一個你沒有在你的示例XAML中顯示。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <StackPanel> 
     <GroupBox FontWeight="Bold" Header="Tables" Padding="2"> 
      <ScrollViewer> 
       <ItemsControl FontWeight="Normal"> 
        <TextBlock>Foo</TextBlock> 
        <TextBlock>Bar</TextBlock> 
        <TextBlock>Baz</TextBlock> 
       </ItemsControl> 
      </ScrollViewer> 
     </GroupBox> 
    </StackPanel> 
</Window> 

現在組框出現在窗口的頂部,尺寸正好適合其內容:如果你的分組框會顯示一個StackPanel內可能出現你描述的問題。如果您足夠縮小窗口,GroupBox將被切斷 - 因爲它的大小適合其內容,而不是其容器。這聽起來像你正在描述的問題。

原因是StackPanel詢問孩子他們的理想身高是什麼(基於他們的內容),並使用該高度。沒有StackPanel(或類似的東西),默認是尊重控件的VerticalAlignment,如果它被設置爲Stretch的默認值,那麼控件被拉伸以填充其父項。這意味着它不會比它的父母高,這聽起來像你想要的。

解決方案:刪除StackPanel(或任何其他導致您的問題),並使用其他的東西。根據你想要完成的事情,你可能會有更好的DockPanel或Grid的運氣。很難說,不知道更多關於你的佈局。

編輯:好了,它看起來像這個問題的確是HeaderedContentControl父 - 但不直接。 HeaderedContentControl不是一個面板,所以它不會自己做任何佈局(和它的後代GroupBox沒有這個相同的問題)。問題是它的默認模板 - 其中包括一個StackPanel。好消息是,你可以自由地使用不同的模板,讓我們說一個有DockPanel中,而不是:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <HeaderedContentControl> 
    <HeaderedContentControl.Style> 
     <Style TargetType="{x:Type HeaderedContentControl}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
      <ControlTemplate TargetType="{x:Type HeaderedContentControl}"> 
       <DockPanel> 
       <ContentPresenter ContentSource="Header" DockPanel.Dock="Top"/> 
       <ContentPresenter/> 
       </DockPanel> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </HeaderedContentControl.Style> 
    <GroupBox FontWeight="Bold" Header="Tables" Padding="2"> 
     <ScrollViewer> 
     <ItemsControl FontWeight="Normal"> 
      <TextBlock>Foo</TextBlock> 
      <TextBlock>Bar</TextBlock> 
      <TextBlock>Baz</TextBlock> 
     </ItemsControl> 
     </ScrollViewer> 
    </GroupBox> 
    </HeaderedContentControl> 
</Window> 

如果你省略了<HeaderedContentControl.Style>部分,這再現了你的問題。但隨着風格的到位,它允許GroupBox填充它的容器,所以ScrollViewer會在你想要的時候得到一個滾動條。

0

嘗試完全移除網格並直接在GroupBox上設置Horizo​​ntalAlignment和VerticalAlignment。如果一個佈局面板只有一個孩子,這通常是多餘的......這種情況在你的案例中是正確的。

如果這不起作用...您的網格控件的父項是什麼?

+0

刪除網格並沒有改變任何東西(但我仍然刪除它,因爲它是多餘的)。網格的父節點是用戶控件,它作爲headeredcontentcontrol的內容加載。我暫時限制了headeredcontentcontrol的高度,以確定這是否正在擴大,但這也沒有解決問題。我也試過下面的'軟件問題'的建議,但沒有成功。 – 2011-01-03 14:40:30

9

如果以前的答案沒有解決問題,您還可以嘗試將網格的寬度,高度綁定到您的父級UserControl的ActualWidth,ActualHeight。喜歡的東西:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="WpfApplication.UserControl1" 
x:Name="UserControl"> 
<Grid Height="{Binding ElementName=UserControl, Path=ActualHeight}" 
     Width="{Binding ElementName=UserControl, Path=ActualWidth}" /> 

在這種情況下,爲什麼不使用你沒有設置明確的寬度和高度,但你限制了網格寬度/高度,以它坐落在用戶控件的限制

0

。一個listbox而不是一個itemscontrol,它有一個內置的scrollviewer。

2

我有同樣的問題,在閱讀此響應後,我用UserControl中的網格替換了所有StackPanel。它解決了滾動條問題。

0

它們是不同的。如果您不想讓項目可選,則不要使用ListBox。它會變得更重,並且每次用戶點擊一個條目時也會取消選擇。只需將ItemsControl放置在ScrollViewer中