2011-10-19 38 views
2

我已經看了全部,並一直無法找到解決我的問題。我的整個方法可能會關閉,如果我只是以錯誤的方式解決問題,我可以重新開始。C#WPF用戶控件的可滾動容器

我有一個頁眉,一個列表框,一個頁腳的WPF窗口。我想以編程方式將n個用戶控件添加到列表框中,並讓列表框本身可滾動(而不是整個窗口)。我也想關閉當你點擊列表框中的一個項目時會發生什麼(背景突出顯示爲藍色 - 我希望它改變用戶控件的背景,現在將其視爲一個大的列表框項目)真的,列表框甚至可能是錯誤的事情。

我試過了stackpanels,scrollpanels和其他六種方法。列表框恰好是我現在使用的。我有十幾種不同類型的用戶控件,並基於業務邏輯需要顯示它們的某些組合,所以我真的需要一個可滾動的用戶控件容器,我可以確定哪一個(如果有的話)被點擊過。

這裏是MainWindow.xaml

<Window x:Class="LayoutTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:customUserControls="clr-namespace:LayoutTest.Properties" 
     Title="Layout Sample" Height="Auto" MaxWidth="600" MinWidth="600" Width="600" ResizeMode="CanMinimize" WindowStartupLocation="CenterScreen"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="393*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions>   
     <TextBlock Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="24" TextAlignment="Center" Margin="5,5,210,5">Header</TextBlock> 
     <ListBox x:Name="lstPanels" Grid.Row="1" Grid.ColumnSpan="2" HorizontalContentAlignment="Stretch" Margin="0,0,0,17"/>   
     <TextBlock Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="24" TextAlignment="Center" Margin="5,5,210,5">Footer</TextBlock> 
    </Grid> 
</Window> 

的XAML這裏是XAML的UserControl1.xaml

<UserControl x:Class="LayoutTest.UserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="100" d:DesignWidth="500" Padding="0" Margin="10"> 
    <Border BorderThickness="2" BorderBrush="OrangeRed" CornerRadius="10"> 
     <StackPanel Orientation="Horizontal"> 
      <Image x:Name="imgLogo" MinWidth="100" MinHeight="100" MaxWidth="100" MaxHeight="100" /> 
      <Grid MinWidth="400"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="108*" /> 
        <ColumnDefinition Width="104*" /> 
        <ColumnDefinition Width="188*" /> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="25*" /> 
        <RowDefinition Height="35*" /> 
       </Grid.RowDefinitions> 
       <TextBlock Text="xxxxx:" Margin="5,2,2,2" /> 
       <TextBlock Grid.Column="1" Grid.ColumnSpan="2" Text="xxxxx" Margin="2" /> 
       <TextBlock Text="xxxxx:" Grid.Row="1" Margin="5,2,2,2" /> 
       <TextBlock Grid.Column="1" Grid.Row="1" Text="xxxxxx" Grid.ColumnSpan="2" Margin="2" /> 
       <CheckBox Content="xxxxxx" Grid.Row="3" Name="chkSkipConfiguration" Grid.ColumnSpan="2" VerticalAlignment="Center" Margin="0,0,112,5" Width="200" HorizontalAlignment="Right" /> 
       <Button Content="xxxxx" Grid.Column="2" Grid.Row="3" Padding="0" HorizontalAlignment="Right" Width="50" Margin="0,0,19,0" /> 
      </Grid> 
     </StackPanel> 
    </Border> 
</UserControl> 

並且最後在構造函數MainWindow.xaml.cs有以下snippet創建用戶控件的10個實例:

 for(int i=0; i<10; i++) 
     { 
      lstPanels.Items.Add(new UserControl1()); 
     } 

回答

3

首先給你的ListBox一個高度和寬度,要麼顯式地要麼通過在容器中拉伸它。使用ListBox,您可以使用ScrollViewer.VerticalScrollBarVisibility =「Visible」定義垂直滾動條。如果你有一個高度定義,那麼它應該自動啓用滾動,因爲你添加的項目超過了這個高度。

只要突出顯示,試試這個setter。只要將其放置在定位爲一個ListBoxItem類型風格:

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
      <Border x:Name="border" Background="Transparent"> 
       <ContentPresenter /> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsSelected" Value="true"> 
       <Setter TargetName="border" Property="Background"> 
        <Setter.Value>Transparent</Setter.Value> 
       </Setter> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
+0

我能夠讓列表框滾動,所以謝謝你,但我堅持這種風格。使用這個標記選擇一個listitem刪除默認的藍色背景,所以這絕對是一個改進。我需要改變它來設置UserControl的背景顏色(這是listboxitem包含的),而不是? UserControl,如我的原始示例所示,具有橙色邊框。如果點擊該項目,我可以遮住usercontrol邊框內的空間。謝謝! – Eric

+1

如果您將該樣式留在ListBoxItem上,我相信您可以通過向您的控件添加一個名爲IsSelected的屬性來實現您想要的效果。如果處理Border元素的PreviewMouseDown或PreviewMouseUp,並將IsSelected設置爲!IsSelected每個事件,然後可以爲IsSelected屬性添加一個DataTrigger以更改邊框或網格的背景。 – Josh

1

就在袖口處...有沒有你無法用ScrollViewer包裝東西,並讓包含的控件通過傳遞消息來響應點擊? ScrollViewer:http://msdn.microsoft.com/en-us/library/ms750665.aspx

+0

我試圖scrollviewers在一個點而是滾動整個頁面。我無法找到任何方法讓頁面中間的一組用戶控件滾動,同時始終保持頁眉和頁腳可見。 文檔中的示例將scrollviewer作爲頂級元素。這可能是可能的,但當我嘗試它時,我無法獲得正確的語法 – Eric

+0

我只是嘗試用scrollviewer替換列表框,並在scrollviewer中放置了一個stackpanel。然後,我將我的用戶控件添加到stackpanel.children而不是listbox.items,並得到了相同的結果。 – Eric