3

バックグラウンド:

設定ページのUIを生成しています。設定は問題のオブジェクトごとに異なるため、設定はディクショナリ内に保存されます。

問題:

ScrollableHeightaのはScrollViewer、コンテンツのサイズに正確ではありません。ScrollViewer変更の内容がScrollableHeightリセットされると、はリセットされませんが、新しい内容の高さが追加されます。

いつ:

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

私が学んだこと:

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++;
    }

 }
4

2 に答える 2

2

これは、MSDNのScrollViewer.ScrollableHeightの予想される動作です。

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

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

編集

バグは、RowDefinitionsをクリアしないことです。したがって、常に新しい行を追加するため、ScrollableHeightは常に追加されているように見えます。私の提案は、別のリストボックスの使用に切り替えて、マスター/詳細パターンを使用することです。

于 2009-08-31T13:04:19.477 に答える
0

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

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

于 2009-08-31T13:17:10.037 に答える