Silverlight 网格没有填满整个空间

Posted

技术标签:

【中文标题】Silverlight 网格没有填满整个空间【英文标题】:Silverlight grid not filling entire space 【发布时间】:2018-08-15 15:28:46 【问题描述】:

我在 wcf 中有内容对象。 我尝试存储在内容属性网格中,但它没有填满整个长度。

函数返回网格:

private Grid ChangeContentObject()
        
            Grid g = new Grid();
            g.Background = new SolidColorBrush(Colors.Red);

            g.HorizontalAlignment = HorizontalAlignment.Stretch;
            g.VerticalAlignment = VerticalAlignment.Stretch;

            ColumnDefinition columnDefinitionForPath = new ColumnDefinition();
            columnDefinitionForPath.Width = new GridLength(4,GridUnitType.Star);

            ColumnDefinition columnDefinitionForEmpty = new ColumnDefinition();
            columnDefinitionForEmpty.Width = new GridLength(6, GridUnitType.Star);

            g.ColumnDefinitions.Add(columnDefinitionForPath);
            g.ColumnDefinitions.Add(columnDefinitionForEmpty);

            WindowsShapes.Path p = new WindowsShapes.Path();
            p.Stroke = new SolidColorBrush(Colors.Brown);
            p.StrokeThickness = 2;

            p.HorizontalAlignment = HorizontalAlignment.Stretch;

            var b = new Binding
            
                Source = "M50,0 L0,0 L0,50 L50,50"
            ;
            BindingOperations.SetBinding(p, WindowsShapes.Path.DataProperty, b);

            p.Stretch = Stretch.Fill;

            g.Children.Add(p);
            Grid.SetColumn(p, 0);

            return g;
        

设置内容代码:

objectVisual.Content = ChangeContentObject();

objectVisual 属性:

objectVisual.VerticalAlignment = Stretch
objectVisual.VerticalAlignment
objectVisual.Width = 100
objectVisual.Height = 50

我得到下一个结果:

为什么网格没有填满整个长度?

【问题讨论】:

我不擅长 WPF,但也许容器是某种 FlowLayoutPanel 或者......我会说某种形式的 ScrollViewer?有更多 WPF 经验的人肯定会给你一个简短而中肯的答案。 【参考方案1】:

您的Grid 有 2 列。第二列是空的,因此已折叠,因此您看不到它。将某些东西绑定到它可以解决“问题”。另外,为这个演示修改了你的Path 数据,因为你拥有的那个不好。看看:

private Grid ChangeContentObject()

    Grid g = new Grid();
    g.Background = new SolidColorBrush(Colors.Red);

    g.HorizontalAlignment = HorizontalAlignment.Stretch;
    g.VerticalAlignment = VerticalAlignment.Stretch;

    // add grid line to show columns border
    g.ShowGridLines = true;

    ColumnDefinition columnDefinitionForPath = new ColumnDefinition();
    columnDefinitionForPath.Width = new GridLength(4, GridUnitType.Star);

    ColumnDefinition columnDefinitionForEmpty = new ColumnDefinition();
    columnDefinitionForEmpty.Width = new GridLength(6, GridUnitType.Star);

    g.ColumnDefinitions.Add(columnDefinitionForPath);
    g.ColumnDefinitions.Add(columnDefinitionForEmpty);

    var p1 = new Path();
    p1.Stroke = new SolidColorBrush(Colors.Brown);
    p1.StrokeThickness = 2;
    p1.Stretch = Stretch.Fill;
    p1.HorizontalAlignment = HorizontalAlignment.Stretch;

    var b1 = new Binding
    
        // modified path data
        Source = "M 10,100 C 10,300 300,-200 300,100"
    ;
    BindingOperations.SetBinding(p1, Path.DataProperty, b1);

    var p2 = new Path();
    p2.Stroke = new SolidColorBrush(Colors.Brown);
    p2.StrokeThickness = 2;
    p2.Stretch = Stretch.Fill;
    p2.HorizontalAlignment = HorizontalAlignment.Stretch;

    var b2 = new Binding
    
        // modified path data
        Source = "M 100,10 C 100,30 -200,100 100,300"
    ;
    BindingOperations.SetBinding(p2, Path.DataProperty, b2);

    g.Children.Add(p1);
    g.Children.Add(p2);
    Grid.SetColumn(p1, 0);
    Grid.SetColumn(p2, 1);

    return g;

更新:

通常,Grid 会自行拉伸和扩展,根本不需要“用空白填充它”。这里的问题是因为您将Grid 包含在objectVisual 中,这显然是ContentControl(您没有在帖子中说清楚)。因此,您应该将objectVisual 设为派生自Panel 的类型,比如另一个Grid

然后,替换这个:

objectVisual.Content = ChangeContentObject();

用这个:

objectVisual.Children.Add(ChangeContentObject());

你会得到你想要的:

更新 2:

嗯,您的 pastebin 代码与您的原始代码略有不同,虽然这也可以,但您误解了我所说的 Grid。您不需要您的var gridChild,您可以将第二列留空,就像您原来的问题一样。请注意,我已将其注释掉。因此,为了澄清,我在下面发布了完整的MCVE 示例代码。结果看起来就像我之前发布的第二张图片。

用户控制 CS:

public partial class SilverlightControl3 : UserControl

    public SilverlightControl3()
    
        InitializeComponent();
    

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    
        objectVisual.Children.Add(ChangeContentObject());
    

    private Grid ChangeContentObject()
    
        Grid g = new Grid();
        g.Background = new SolidColorBrush(Colors.Red);

        g.HorizontalAlignment = HorizontalAlignment.Stretch;
        g.VerticalAlignment = VerticalAlignment.Stretch;

        // add grid line to show columns border
        g.ShowGridLines = true;

        ColumnDefinition columnDefinitionForPath = new ColumnDefinition();
        columnDefinitionForPath.Width = new GridLength(4, GridUnitType.Star);

        ColumnDefinition columnDefinitionForEmpty = new ColumnDefinition();
        columnDefinitionForEmpty.Width = new GridLength(6, GridUnitType.Star);

        g.ColumnDefinitions.Add(columnDefinitionForPath);
        g.ColumnDefinitions.Add(columnDefinitionForEmpty);

        var p1 = new Path();
        p1.Stroke = new SolidColorBrush(Colors.Blue);
        p1.StrokeThickness = 2;
        p1.Stretch = Stretch.Fill;
        p1.HorizontalAlignment = HorizontalAlignment.Stretch;

        g.Children.Add(p1);
        Grid.SetColumn(p1, 0);

        var b1 = new Binding
        
            Source = "M 10,100 C 10,300 300,-200 300,100"
        ;
        BindingOperations.SetBinding(p1, Path.DataProperty, b1);

        // you dont necessarily need this here, you can keep it empty like before
        /*
        var gridChild = new Grid();
        g.Children.Add(gridChild);
        Grid.SetColumn(gridChild, 1);
        */

        return g;
    

用户控件 XAML:

<UserControl x:Class="SilverlightApplication4.SilverlightControl3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded">

    <Grid x:Name="LayoutRoot" Background="White">
        <Grid x:Name="objectVisual" />
    </Grid>
</UserControl>

主窗口:

<UserControl x:Class="SilverlightApplication4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:SilverlightApplication4"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot">
        <local:SilverlightControl3 />
    </Grid>
</UserControl>

【讨论】:

我尝试在两列中使用网格,但我再次得到不正确的结果。如何用空白填充第二列? @noobprogrammer 请参阅我们上面的更新 @noobprogrammer 请查看我们的更新 2。这是一个MCVE,这意味着您可以在一个全新的项目中使用它来确认结果。

以上是关于Silverlight 网格没有填满整个空间的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 动态高度内容(自动布局)没有填满整个空间

pyqt5选项卡区域没有填满整个可用空间

带有 PageTabViewStyle 的 TabView 屏幕中的背景不会填满整个可用的垂直空间

约束文本字段,使它们之间有均匀的空间并填满整个屏幕

UITableView 不会在 iPad 上填满整个屏幕

Silverlight OLAP 数据网格? [关闭]