8

ウィンドウのサイズ変更や解像度の変更に応じて、LOBフォームのラベルとテキストボックスのフォントサイズを拡大および縮小したい。これを実現するために、ラベルとテキストボックスをビューボックス内に配置しました。

ラベルとカスタムラジオボタンは期待どおりに動作しますが、テキストボックスはビューボックスを埋めるために水平方向に伸びません(担当者のために画像を投稿できません)。テキストボックスに入力すると、テキストボックスはビューボックスを水平方向に埋めます。

これが私が使っているコードの例です:

  <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.186*"/>
            <ColumnDefinition Width="0.814*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="0.127*"/>
            <RowDefinition Height="0.873*"/>
        </Grid.RowDefinitions>
        <Viewbox Margin="0,0,0.917,0">
            <Label Content="First name:"/>
        </Viewbox>
        <Viewbox Grid.Column="1">
            <TextBox TextWrapping="Wrap"/>
        </Viewbox>
    </Grid>

ビューボックス内にグリッド、スタックパネル、ドックパネル(LastChildFill = "True"を使用)を配置してから、これらのレイアウトコントロール内にテキストボックスを配置しようとしましたが、これも機能しませんでした。テキストボックスを親ビューボックスに水平方向に埋める方法はありますか?

この問題はこれに似ています。WPFTextBoxはStackPanelに入力されませんが、この問題はビューボックスではなくスタックパネルにあります。

4

3 に答える 3

10

あなたが望むことは簡単には不可能だと思います。ViewBoxは、レイアウトのメジャーパスで、子に無限のスペースがあることを通知します。その後、ディスプレイがビューボックスに収まります。現在、無限のスペースがあると言われているテキストボックスは、明らかに拡大できません。私には2つの解決策があります。これはあなたが望むものではないと思いますが、とにかく役立つかもしれません。

最初:

<Viewbox Grid.Column="1" Grid.Row="0" Stretch="Uniform" >
    <Grid Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Viewbox}}, Path=ActualWidth}">
      <TextBox TextWrapping="Wrap" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </Grid>
</Viewbox>

これにより、テキストボックスが実際に拡張されますが、ビューボックスから期待される動作が無効になります。なんで?アスペクト比を維持するようにViewBoxに指示し、テキストボックスのサイズを維持するビューボックスの幅全体を埋めるようにテキストボックスを設定しました。

二番目:

ラベルから取得したグリッドに高さを追加し、ビューボックスのscaletransformで変更します。

これは私が試したことはありませんが、値コンバーターが含まれます。

結論:ビューボックスが子をレイアウトする方法のため、目的を達成する簡単な方法はありません。水平方向にストレッチしたいだけの場合、スケーリングしたいのであれば、私の最初のソリューションはうまく機能します。私の推測では、あなたはそれを自分でしなければならないということです。

于 2012-01-04T12:47:48.737 に答える
3

あなたが望むものがうまくいかない/簡単ではない場合は、それを偽造してください:

    <TextBox GotFocus="TextBox_GotFocus" HorizontalAlignment="Stretch" BorderThickness="0" Grid.Column="1"/>
    <Viewbox HorizontalAlignment="Left" Stretch="Uniform" Grid.Column="1">
        <TextBox x:Name="NameTextBox" Width="50" TextWrapping="Wrap" Text="Text" BorderThickness="0"/>
    </Viewbox>

    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        NameTextBox.Focus();
        NameTextBox.SelectionStart = NameTextBox.Text.Length;
    }

基本的に何が起こるかは別のものTextBoxが後ろにViewboxあり、後ろTextBoxがフォーカスを取得すると、フォーカスをViewbox'sに切り替えますTextBox。グリッドを相対的なサイズで設定しているため、これにより奇妙なサイズ変更が発生します。希望する効果が得られるまで、グリッドの列/幅のサイズを試してみる必要があります。

于 2012-01-04T18:02:31.997 に答える
1

コンバーターを使用するだけ

FontSizeを次のように設定します。 FontSize="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight ,Converter={StaticResource heightconverter}, ConverterParameter=3}"

public class ProcentualHeightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (parameter is string p)
        {
            if (value is double v)
            {
                var result = double.TryParse(p, out double param);
                if (result)
                {
                    return v / param;
                }
            }
        } 
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2021-10-27T09:46:17.913 に答える