2016-11-18 13 views
0

の各項目にUserControlを横に表示する必要があります。それはStackPanelで行うことができますが、私が知っているように、StackPanelはコンテンツが配置されるまでラップされます。しかし、GridListBoxes)のように、親(この例ではListView)を縦に塗りつぶす必要があります。ちなみに、私のUserControlはこれです:水平ListView内のUserControlが親を垂直に塗りつぶすことはできません

<UserControl x:Class="ResourceEditor.LanguagePanel" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:resources="clr-namespace:ResourceEditor.Resources"    
     xmlns:viewModel="clr-namespace:ResourceEditor.ViewModel"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"></RowDefinition> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <DockPanel Grid.Row="1" LastChildFill="True" DockPanel.Dock="Bottom"> 
     <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" DockPanel.Dock="Right" IsChecked="{Binding SortByThis}"></CheckBox> 
     <UniformGrid Columns="2" Rows="0"> 
      <Button Content="{x:Static resources:Strings.Save}" DockPanel.Dock="Left" Command="{Binding SaveCommand}"></Button> 
      <Button Content="{x:Static resources:Strings.Reset}" DockPanel.Dock="Left" Command="{Binding ResetCommand}"></Button> 
     </UniformGrid> 

    </DockPanel> 


     <ListBox Grid.Row="0" SelectedItem="{Binding SelectedWord}" ItemsSource="{Binding Words}"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseDoubleClick"> 
        <command:EventToCommand Command="{Binding Mode=OneTime, Path=EnableEditingCommand}" 
          PassEventArgsToCommand="False" /> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
      <ListBox.ItemTemplate> 
       <HierarchicalDataTemplate DataType="viewModel:WordNodeVM"> 
       <TextBox IsEnabled="{Binding DataContext.CanEdit, RelativeSource={RelativeSource AncestorType=UserControl}}" Text="{Binding Name}"></TextBox> 
       </HierarchicalDataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
</Grid> 

そして、これは私がそれを使用する方法です:

<ListView Grid.Row="2" ItemsSource="{Binding Languages}"> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="ListViewItem"> 
       <Setter Property="Focusable" Value="false"/> 
      </Style> 
     </ListView.ItemContainerStyle> 
     <ListView.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Rows="1" Columns="{Binding Languages.Count}"> 

       </UniformGrid> 
      </ItemsPanelTemplate> 
     </ListView.ItemsPanel> 
     <ListView.ItemTemplate> 
      <HierarchicalDataTemplate DataType="{ x:Type viewModel:LanguagePanelViewModel}"> 
       <resourceEditor:LanguagePanel DataContext="{Binding}"></resourceEditor:LanguagePanel> 
      </HierarchicalDataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

私はアラインメントを使用して、コンテナを変更し、すべての可能な解決策を試してみました、コンテンツの整列私のユーザコントロールを垂直空間を埋めるようにすることはできませんでした。最初はUserControlの場合はStackPanelのように動作するので、間違っていると思っていましたが、それはどちらでもありません。

+0

WPFにはWrapPanelというコントロールがありますが、探しているのですか? –

+0

私は垂直に親を埋める必要があります。しかし、 'WrapPanel'は' StackPanel'よりも悪く、ユーザコントロールの最小限のサイズを囲んでいます。 – Javidan

答えて

0

私は現在の問題の解決策を見つけることができませんでした。しかし、私が望んでいた振る舞いの点では、この方法で実現しました。 レイアウトからListViewを削除しました。空を追加しましたGrid。背景コードで、私はMVVMのルールを破るないしようとしたが、このloadGrid方法は、私に従ってリストchanges.Asは、この質問に答えていないとき、私は答えとして、それを受け入れることはありませんと呼ばれているこの

public MainWindow() 
    { 
     var model=new MainViewModel(loadGrid); 
     DataContext = model; 
     InitializeComponent(); 
     Closing += (s, e) => ViewModelLocator.Cleanup(); 

    } 

    void loadGrid(IList<LanguagePanelViewModel> panels) 
    { 

     if (panels == null || !panels.Any()) 
      return; 

     for (int i = 0; i < panels.Count; i++) 
     { 
      mainGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star)}); 
      var panel = new LanguagePanel { DataContext = panels[i] }; 
      Grid.SetColumn(panel, i); 
      mainGrid.Children.Add(panel); 
     } 
    } 

を追加しました強力な答えを期待しています。

関連する問題