【问题标题】:How to programmatically maintain aspect ratio of object in wpf如何以编程方式保持wpf中对象的纵横比
【发布时间】:2017-02-15 05:07:12
【问题描述】:

我以编程方式将具有特定宽度和高度的Border 添加到网格中。但是,我想获得以下任何一项:

  1. 使边框保持纵横比和填充使其在网格内尽可能大
  2. 每当网格缩小或放大时使边框缩放(所以不是特别大,更像是网格的百分比)

目前这是我调整窗口大小时的情况:

Color borderColor = (Color)ColorConverter.ConvertFromString(BorderColor);
Color backgroundColor = (Color)ColorConverter.ConvertFromString(BackgroundColor);

Border border = new Border();
border.BorderThickness = new Thickness(BorderSize);
border.CornerRadius = new CornerRadius(TopLeftCornerRadius, TopRightCornerRadius, BottomRightCornerRadius, BottomLeftCornerRadius);
border.BorderBrush = (SolidColorBrush)(new BrushConverter().ConvertFrom(BorderColor));
border.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom(BackgroundColor));

border.Width = Width;
border.Height = Height;

border.Margin = new Thickness(10);

previewgrid.Children.Add(border);

正常情况:

规模化情况:

所以我希望它能够正确调整大小并保持在白色矩形内。顺便说一句,如您所见,白色网格有一个边距;-) 提前致谢!

【问题讨论】:

  • 您需要将网格分成 3 列:第一个和最后一个“Auto”,中间是“*”。中间是矩形,两侧是边框。
  • 或者ViewBox可以帮助你达到目标
  • @lerthe61 确实看过,但不知道到底是怎么回事
  • previewcanvas 是画布吗?
  • @Derp 你可以试试这样: var viewBox = new Viewbox(); viewBox.Child = 边框; previewgrid.Children.Add(viewBox);

标签: c# wpf


【解决方案1】:

正如 lerthe61 建议的那样,只需使用 Viewbox 并将其 Stretch 属性设置为 Uniform

Color borderColor = (Color)ColorConverter.ConvertFromString(BorderColor);
Color backgroundColor = (Color)ColorConverter.ConvertFromString(BackgroundColor);

Border border = new Border();
border.BorderThickness = new Thickness(BorderSize);
border.CornerRadius = new CornerRadius(TopLeftCornerRadius, TopRightCornerRadius, BottomRightCornerRadius, BottomLeftCornerRadius);
border.BorderBrush = (SolidColorBrush)(new BrushConverter().ConvertFrom(BorderColor));
border.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom(BackgroundColor));

border.Width = Width;
border.Height = Height;

border.Margin = new Thickness(10);

Viewbox viewBox = new Viewbox();
viewBox.Stretch = Stretch.Uniform;
viewBox.Child = border;

previewgrid.Children.Add(viewBox);

请注意,如果previewgridCanvas,则此解决方案不起作用。 希望对你有帮助。

【讨论】:

    【解决方案2】:

    最简单的方法:

     <Grid Margin="50">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="50" />
        </Grid.ColumnDefinitions>
        <Border CornerRadius="50,0,0,50"
                Background="Green" />
        <Border CornerRadius="0"
                Grid.Column="1"
                Background="Green" />
        <Border CornerRadius="0,50,50,0"
                Grid.Column="2"
                Background="Green" />
    
    </Grid>
    

    通过 C#:

            myGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(50) });
            myGrid.ColumnDefinitions.Add(new ColumnDefinition());
            myGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(50) });
    
            Border b1 = new Border
            {
                Background = new SolidColorBrush(Colors.Blue),
                CornerRadius = new CornerRadius(100, 0, 0, 100)
            };
    
            Grid.SetColumn(b1, 0);
    
            Border b2 = new Border
            {
                Background = new SolidColorBrush(Colors.Blue),
            };
            Grid.SetColumn(b2, 1);
            Border b3 = new Border
            {
                Background = new SolidColorBrush(Colors.Blue),
                CornerRadius = new CornerRadius(0, 100, 100, 0),
            };
            Grid.SetColumn(b3, 2);
    
            myGrid.Children.Add(b1);
            myGrid.Children.Add(b2);
            myGrid.Children.Add(b3);
    

    正常:

    调整大小:

    对你来说够好吗?

    【讨论】:

    • 1.它必须在 C# 中完成,而不是 XAML(不幸的是)和 2. 它不保持纵横比,所以不幸的是不够好:(
    • @Derp 为什么 XAML 不够用?
    • 因为它是来自 XML 文件的反序列​​化对象,并且值可以更改,因此 XAML 无法做到这一点(据我所知)
    • 您可以获取这些值并将它们传输到 C# :) 代码与您的相似,您只需要将网格分隔为 3 列,而不是 1 边框使用 3。但想法很清楚。不是吗?
    • 如果您可以在帮助下更新您的答案,那就太棒了;)只要您假设这些值可能不同。我有一个从 xml 文件生成标签的程序,所有标签都有不同的尺寸,仅供参考
    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 2020-02-19
    • 2013-04-01
    • 1970-01-01
    • 2017-11-13
    • 2010-12-17
    • 2018-04-15
    • 2022-08-17
    相关资源
    最近更新 更多