背景:WPF:どのようにScrollViewerのを再計算/リセットするには、 "ScrollableHeight"
私は設定ページのためのUIを生成しています。設定は各オブジェクトで異なるため、設定は辞書内に保存されます。
問題:
ScrollViewer
のScrollableHeight
は、コンテンツのサイズにacurateではありません。 ScrollViewer
の内容がScrollableHeight
に変更されても、新しいコンテンツの高さは追加されません。
時:
は私がScrollViewer
内の子要素である、Grid
内のコンテンツを生成しています。内容はRowDefinitions
であり、名前と値のペアはTextBlocks
とTextBoxes
と表示されます。異なるオブジェクトがそのプロパティを編集するために選択されると、グリッドの子はクリアされ、プロパティを表示するUIが再生成されます。問題の定義で前述したように、生成されたコンテンツの高さは、ScrollViewer
のScrollableHeight
プロパティに追加されます。
は、私が学んだこと:
私の最初の考えはクリアしたScrollViewer
のScrollableHeight
、正しいサイズを達成するために、行の高さを追加する追加の行ごとに。問題は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++;
}
}
ListBoxとDataTemplateを使用して、ScrollViewerとGridを使用するよりも簡単にすることをお勧めします。 – user7116
DataTemplateを持つListBoxは、実際には洗練されたソリューションを可能にします。上記の解決策は、Grid内のTextBlock TextBoxペアである他のスクリーンと「一致する」スクリーンを開発することを目標にしています。しかし、これはDataTemplateを使って実現できるということは間違いありません。私はXAMLにあるはずのC#でUIを実装するファンではありません。 状況が悪い場合は、完全なPropertyGridコントロールを開発するか、http://www.codeplex.com/wpgなどのように見えますが、オープンソース実装を使用します。ありがとう – holsee