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"),然后将文本框放置在这些布局控件中,但这也不起作用。反正有没有让文本框水平填充父视图框?

这个问题与此类似:WPF TextBox won't fill in StackPanel but this problem is with stackpanels, not viewboxes。

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="{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 回答