2011-10-19 25 views
2

私はすべてを見て、私の問題の解決策を見つけることができませんでした。私の全面的なアプローチは外れているかもしれません。私が単純に間違った方法で取り組んでいれば、私はやり直すことができます。C#WPFユーザーコントロール用のスクロール可能なコンテナ

私はヘッダー、リストボックス、フッターを持つWPFウィンドウを持っています。私は、プログラムでn個のユーザーコントロールをリストボックスに追加し、リストボックス自体をスクロール可能にしたい(ウィンドウ全体ではない)。私はまた、リストボックス内の項目をクリックすると何も起こりません(背景が青色で強調表示されます - ユーザーコントロールの背景を変更して大きなリストボックス項目として扱うようにしたい)本当にリストボックスは間違っているかもしれませんもの。

私は、スタックパネル、スクロールパネル、およびその他の方法を半ダース試してみました。リストボックスはちょうど今私が使っているものである。私は十種類の異なるユーザコントロールを持っており、ビジネスロジックに基づいてそれらの組み合わせを表示する必要があります。実際には、スクロール可能なusercontrolコンテナが必要です。ここで

は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のコンストラクタに次がありますスニペットを使用して、ユーザーコントロールのインスタンスを10個作成します。

答えて

3

まず、リストボックスの高さと幅を明示的に、またはコンテナ内でストレッチします。 ListBoxでは、ScrollViewer.VerticalScrollBarVisibility = "Visible"を使用して垂直スクロールバーを定義できます。定義されている高さがある場合、追加されたアイテムがその高さを超えてスクロールを自動的に有効にするはずです。

ハイライトが表示されている限り、このセッターを試してみてください。

<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

リストボックスをスクロールすることができました。ありがとうございますが、私はこのスタイルに固執しています。このマークアップを使用してリスト項目を選択すると、デフォルトの青い背景が削除されるので、間違いなく改善されます。代わりに、ListContentItemに含まれるUserControlの背景色を設定するために、何を変更する必要がありますか?私の元の例で示されているように、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

一度にスクロールビューアーを試しましたが、そのページ全体がスクロールされました。ヘッダーとフッターを常に表示したまま、スクロールするためにページの途中で複数のusercontrolを取得する方法が見つかりませんでした。 文書の例では、トップレベルの要素としてscrollviewerがあります。それは可能かもしれないが、私はそれを試したときに正しい構文を得ることができなかった – Eric

+0

私はscrollviewerでリストボックスを置き換え、scrollpanerの中にスタックパネルを配置しようとしました。私はlistbox.itemsの代わりにstackpanel.childrenに自分のusercontrolを追加して同じ結果を得ました。 – Eric

関連する問題