代码之家  ›  专栏  ›  技术社区  ›  user3499880

Silverlight网格未填满整个空间

  •  2
  • user3499880  · 技术社区  · 7 年前

    我在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
    

    我得到下一个结果:

    enter image description here

    为什么网格不填充整个长度?

    1 回复  |  直到 7 年前
        1
  •  0
  •   jsanalytics    7 年前

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

    enter image description here

    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;
    }
    

    更新时间:

    通常,a 网格 会自行伸展和扩展,根本不需要 “用空格填充” 。这里的问题是由于您将 网格 包含在 objectVisual ,这显然是 ContentControl (你在帖子里没有说清楚)。所以,你应该 objectVisual 派生自的类型 Panel ,比如说,另一个 网格

    然后,替换此:

    objectVisual.Content = ChangeContentObject();
    

    使用此选项:

    objectVisual.Children.Add(ChangeContentObject());
    

    你会得到你想要的:

    enter image description here

    更新2:

    嗯,你的 粘贴箱 代码与您的原始代码略有不同,虽然这也会起作用,但您误解了我所说的 网格 。你不需要 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>