2009-08-31 94 views
3

背景:WPF:どのようにScrollViewerのを再計算/リセットするには、 "ScrollableHeight"

私は設定ページのためのUIを生成しています。設定は各オブジェクトで異なるため、設定は辞書内に保存されます。

問題:

ScrollViewerScrollableHeightは、コンテンツのサイズにacurateではありません。 ScrollViewerの内容がScrollableHeightに変更されても、新しいコンテンツの高さは追加されません。

時:

は私がScrollViewer内の子要素である、Grid内のコンテンツを生成しています。内容はRowDefinitionsであり、名前と値のペアはTextBlocksTextBoxesと表示されます。異なるオブジェクトがそのプロパティを編集するために選択されると、グリッドの子はクリアされ、プロパティを表示するUIが再生成されます。問題の定義で前述したように、生成されたコンテンツの高さは、ScrollViewerScrollableHeightプロパティに追加されます。

は、私が学んだこと:

私の最初の考えはクリアしたScrollViewerScrollableHeight、正しいサイズを達成するために、行の高さを追加する追加の行ごとに。問題はScrollableHeightを設定できないことです(プライベートセッター)。

コード:

XAML:

<ScrollViewer Name="svScroller" Grid.Row="0"> 
    <Grid x:Name="gdPropertyGrid" Margin="10"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="35*" /> 
      <ColumnDefinition Width="65*" /> 
     </Grid.ColumnDefinitions> 
    </Grid> 
</ScrollViewer> 

C番号:

//Get Selected Item 
var listBox = ((ListBox)sender); 
var provider = listBox.SelectedItem as IProviderConfiguration; 

if (provider != null) 
{ 
    tbTitle.Text = String.Format("Properties for {0}",provider.Name); 

    int rowCount = 0; 

    PropertyGrid.Children.Clear(); 

    //Get properties 
    foreach (var property in provider.Properties) 
    { 
     //Create Grid Row 
     var rowDef = new RowDefinition() {Height = new GridLength(30)}; 
     PropertyGrid.RowDefinitions.Add(rowDef); 

     //Create Name Label 
     var tbPropertyName = new TextBlock { 
       Text = property.Key, 
       VerticalAlignment = VerticalAlignment.Center 
     }; 

     //Create Value input 
     var tbPropertyValue = new TextBox { 
       Text = property.Value.ToString(), 
       VerticalAlignment = VerticalAlignment.Center 
     }; 

     //Add TextBlock & TextBox Grid 
     PropertyGrid.Children.Add(tbPropertyName); 
     PropertyGrid.Children.Add(tbPropertyValue); 

     //Set Grid.Row Attached property 
     Grid.SetRow(tbPropertyName, rowCount); 
     Grid.SetRow(tbPropertyValue, rowCount); 

     Grid.SetColumn(tbPropertyValue, 1); 

     rowCount++; 
    } 

} 
+0

ListBoxとDataTemplateを使用して、ScrollViewerとGridを使用するよりも簡単にすることをお勧めします。 – user7116

+0

DataTemplateを持つListBoxは、実際には洗練されたソリューションを可能にします。上記の解決策は、Grid内のTextBlock TextBoxペアである他のスクリーンと「一致する」スクリーンを開発することを目標にしています。しかし、これはDataTemplateを使って実現できるということは間違いありません。私はXAMLにあるはずのC#でUIを実装するファンではありません。 状況が悪い場合は、完全なPropertyGridコントロールを開発するか、http://www.codeplex.com/wpgなどのように見えますが、オープンソース実装を使用します。ありがとう – holsee

答えて

2

MSDNからScrollViewer.ScrollableHeightの予想される動作である:

取得スクロール可能なコンテンツ要素の垂直方向のサイズを表す値。

おそらくScrollViewer.ViewPortHeightをお探しですか?または、ScrollViewerがスクロールする前に特定のポイントまで伸びるように探しているかもしれません。その場合、別の解決策を検討する必要があります。

EDIT

バグあなたは常に新しい行を追加しますので、それゆえScrollableHeightは常に、に追加されるように見えますが、あなたはRowDefinitionsをクリアしていないです!私の提案では、別のListBoxを使用してマスターディテールパターンに切り替えることです。

+0

メタコメント:ScrollableHeightはGrid.ActualHeightと等しくなければなりません。スヌープでそれを確認することができます。 – user7116

+0

明確にするために、答えは「バグはRowDefinitionsをクリアしていないか」です。ありがとう – holsee

0

間違ったプロパティで何かをしようとしているような問題の説明から@sixlettervariablesに同意します。私はあなたが望む結果が何であるかを正確にはわかりませんが、同じスクロールビューア内で異なる数のアイテムを持ち、必要に応じて展開して実行時にできるだけ多く表示できるようにしたいと思っています。

ScrollViewer.ViewPortHeightを使用すると、可視領域を設定できます。読み取り/書き込みプロパティであり、コンテンツが大きすぎて表示領域に収まらない場合はスクロールバーが自動的に表示されます。

関連する問題