2

の中にテキストボックスがStackPanelあり、TextBoxはに設定されてAcceptsReturnいるので、Enter / Returnキーを押すと、テキストボックスの高さが大きくなります。

StackPanel私が抱えている問題は、テキストボックスと一緒に周囲の高さを変更する方法がわからないことです。したがって、テキストボックスが変更されると、。も変更されStackPanelます。

どうすればこれを行うことができますか?

    <GridView x:Name="texties" Grid.Row="1" Margin="120, 0, 0, 0" ItemsSource="{Binding Something, Mode=TwoWay}" SelectionMode="Multiple">
        <GridView.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="10" Orientation="Vertical" Width="210" >
                    <StackPanel.ChildrenTransitions>
                        <TransitionCollection>
                            <AddDeleteThemeTransition/>
                        </TransitionCollection>
                    </StackPanel.ChildrenTransitions>
                    <TextBlock Text="{Binding Name, Mode=TwoWay}" FontWeight="Bold" Style="{StaticResource ItemTextStyle}" />
                    <TextBox Text="{Binding Content, Mode=TwoWay}" FontSize="12" Background="{x:Null}" BorderBrush="{x:Null}" BorderThickness="0, 0, 0, 0" AcceptsReturn="True" IsSpellCheckEnabled="True" />
                </StackPanel>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
4

1 に答える 1

1

サンプルに基づいて、を設定していませんGridView.ItemsPanel。のデフォルト値はGridView.ItemsPanel<WrapGrid />変更できないセルサイズが設定されているものです。に更新したくなるかもしれませんが<VariableSizedWrapGrid />、このコントロールはレンダリング中を除いてスパン値を変更できません。あなたが望むものさえ可能であるならば、それはあなたがあなた<StackPanel/>として使うことを要求するでしょうGridView.ItemsPanel。ただし、<StackPanel/>はネイティブにラップされないため、他の誰かが作成したラップバージョンを見つけるか、独自に作成するか、単一の行または列でそれを使用する必要があります。

一部の開発者は、の高さに基づいてテンプレートのサイズを変更しようとし<TextBlock />ます。これは良い考えですが、実行するのが難しい技術です。UIエレメントのサイズは、レンダリングされるまで決定されないため、最初にレンダリングする必要があり、それから手遅れになります。1人の開発者がこの計算をどのように達成したかを知りたい場合(font-family、font-size、marginなどの難しさを考慮してください)は、こちらをご覧ください。このような計算により、を使用できるようになります<VariableSizedWrapGrid />

このサンプルでは、​​彼は楕円を計算していますが、これは同じ計算です。

protected override Size MeasureOverride(Size availableSize)
{
    // just to make the code easier to read
    bool wrapping = this.TextWrapping == TextWrapping.Wrap;


    Size unboundSize = wrapping ? new Size(availableSize.Width, double.PositiveInfinity) : new Size(double.PositiveInfinity, availableSize.Height);
    string reducedText = this.Text;


    // set the text and measure it to see if it fits without alteration
    if (string.IsNullOrEmpty(reducedText)) reducedText = string.Empty;
    this.textBlock.Text = reducedText;
    Size textSize = base.MeasureOverride(unboundSize);


    while (wrapping ? textSize.Height > availableSize.Height : textSize.Width > availableSize.Width)
    {
        int prevLength = reducedText.Length;

        if (reducedText.Length > 0)
            reducedText = this.ReduceText(reducedText);    

        if (reducedText.Length == prevLength)
            break;

        this.textBlock.Text = reducedText + "...";
        textSize = base.MeasureOverride(unboundSize);
    }

    return base.MeasureOverride(availableSize);
}

幸運を祈ります。

于 2013-01-24T18:56:13.683 に答える