问题  包裹板儿童可以对齐吗?

玻璃杯

知名会员
已加入
2019年11月22日
留言内容
126
编程经验
Beginner
我有一个带有几个标签的包装面板,用户可以启用或禁用这些标签(折叠或显示)。当它环绕时,第二行上的标签与上面的标签不对齐(因为它们的长度不同)。
有没有办法使它们彼此对齐,使它们的中心对齐?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
发布您的Xaml代码
 

玻璃杯

知名会员
已加入
2019年11月22日
留言内容
126
编程经验
Beginner
这里是。

C#:
<Window x:Class="WpfApp1.MainWindow"
        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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Width="452" Height="290"  WindowStartupLocation="CenterScreen" >


    <Grid x:Name="MyGrid" Width="Auto">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        
        <TextBlock Margin="5,5,5,5" Text="Row A Column A" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row A Column B" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row A Column C" Grid.Row="0" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row A Column D" Grid.Row="0" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row B Column A" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row B Column B" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row B Column C" Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row B Column D" Grid.Row="1" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row C Column A" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row C Column B" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row C Column C" Grid.Row="2" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row C Column D" Grid.Row="2" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row D Column A" Grid.Row="3" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row D Column B" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row D Column C" Grid.Row="3" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row D Column D" Grid.Row="3" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row E Column A" Grid.Row="4" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row E Column B" Grid.Row="4" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row E Column C" Grid.Row="4" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row E Column D" Grid.Row="4" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row F Column A" Grid.Row="5" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row F Column B" Grid.Row="5" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row F Column C" Grid.Row="5" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row F Column D" Grid.Row="5" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row G Column A" Grid.Row="6" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row G Column B" Grid.Row="6" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row G Column C" Grid.Row="6" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <TextBlock Margin="5,5,5,5" Text="Row G Column D" Grid.Row="6" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
    </Grid>
</window>
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,532
地点
弗吉尼亚州切萨皮克
编程经验
10+
现在正忙于其他事物,但这可能有助于使脑细胞针对差异进行工作:

从总是很棒的乔什·史密斯(Josh Smith):
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
我很好奇为什么大小改变了,好像没有应用边距?那是正常行为吗?我之前在文本块中使用了margin,并且没有任何问题。
这margin is being applied. If it wasn't I wouldn't have given it to you with margin parameters. Yes, its normal behaviour. They are not the same controls, as Skydiver's first link points out as I also hinted at previously in this topic about element fragments. Text blocks are like Grid.ColumnDefinitions in that they are fragment elements of the Grid control, hence why we can add Column/RowDefinitions in our Xaml code, because they too are just like the Textblocks. As I said here :
Grid.ColumnDefinition是网格控件的子片段。
同样适用于您正在使用的这些元素片段。它们只是另一个控件的元素。保证金属性对您正在使用的控件都起作用;和文本块元素。
 

玻璃杯

知名会员
已加入
2019年11月22日
留言内容
126
编程经验
Beginner
现在正忙于其他事物,但这可能有助于使脑细胞针对差异进行工作:

从总是很棒的乔什·史密斯(Josh Smith):

感谢这些链接,我现在更加了解这些差异。

编辑:跳伞运动员,您在示例中使用了包装板,但是Sheepings说您应该使用网格?我不明白  :( 在Sheepings示例中,网格定义设置为auto,但是包装不存在,这就是为什么我认为使用包装面板的原因。

如果像我在示例中所做的那样使用“自动”值,为什么它们必须移动或移动到其他网格。

关于这一点,我想进一步澄清一下,到目前为止,据我所知,他们(除了第一个)必须在某种程度上以任何一种方式移动到另一个单元格,例如,仅使用两个标签,假设用户折叠了其他用户,如下所示:

注释2020-01-11 142406.jpg


减小窗口的宽度将导致第二个标签移动到另一个网格单元,如下所示:

注释2020-01-11 142635.jpg


"Row A Column B"显然是该单元格所在的文本错误,但要注意的是它在网格内移动。所以当你问"他们为什么要搬家"这就是我的想法,对我来说是他们正在转移到另一个单元,但是也许我只是使用了错误的术语或其他东西?

因此,在第一张图片中,行已减少到一列,而列减少到了两列,这是在后面的代码中完成的(当然,实际上,我在这里不是从理论上讲),然后调整窗口的大小将产生一个新行,将标签移到该新单元格,然后删除第二列,对吗?第二次编辑:这是跳伞者代码的功能,但是我看不到它与导致它发生的示例之间的区别,他甚至没有使用网格。我以为我对这件事了解得更好,但似乎我仍在努力把握这一小事情。
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,532
地点
弗吉尼亚州切萨皮克
编程经验
10+
My response in post #19 was just to address your original question whether there was an easy way to get the WrapPanel to line up the items vertically. I also took advantage of the behavior of a TextBox in a Border to force the text to the bottom of the border area, and thereby force everything below it to line up horizontally as you were seeking to do with your numbers below your text. The resizing behavior just came for free.

所有这些就像驾驶自动变速器的汽车一样。 @谢平 将教我们如何使用手动变速箱驾驶。我们一直在离线讨论,与您一样,我有一组并行的查询。他足够客气,可以分享自己的知识。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
Your recent problem with resizing the window is a different problem, and one which should be addressed on a new topic when you reach that stage. First, stick with this topic and write the Xaml as I have shown and explained to you. Give your Grid a name, and then write your C# code in your Code behind file for adding the functionality of adding new controls to your grid. Once you reach this point, you will probably end up using a wrap panel around all of the grids items, (that is of course if you don't want to bother writing a lengthy class based on the Window Size from the Windows SizeChangedEventArgs to structure your grids elements based on the window size and how many items are in your grid.) Yes this would be avoided by using a wrap panel. That being said, I'd prefer to write an explicit class to handle the grids elements when the Window changes size. I don't think there are many programmers who would do it my way, so I am not advising that you do either, as the simpler thing at that point would be to use a wrap panel and be done with it. As an added exercise, you could always remove your wrap panel and write an explicit class to handle your Grids elements when your window size changes.
您已经使用了正确的结构。您正在使用 a 网格,这是要使用的正确控件。但是我试图避免您也使用自动换行面板,因为通过编写Xaml代码,您将学到更多,但是更重要的是,在文件后面编写自己的代码,该文件包含了控制如何添加和添加新项目的所有逻辑。删除。包括调整窗口大小时发生的情况。通过编写一个类,并通过文件后面的代码操纵网格行为,所有这些都是可行的。只要提供您在Xaml标记中写出的项目名称,您就可以在文件背后的代码中有效地操作它们。

跳伞运动员的工作是使用ItemsControl,尽管他的示例没有错,但我也不怎么做。这样做的原因是因为它做了我不想做的事情。看这里 : WPF ItemsControl示例 由于数据模板通常要求开发人员使用某种 "layout" panel 在上面放数据。

这ItemsControl already uses a stack panel inherently.  :) 无论如何,我和跳伞运动员确实在跳伞运动员为您写出自己的榜样之前就此事进行了讨论。他认为不使用堆栈或包装面板的网格相当复杂,因此将其数据模板与ItemsControl一起使用是避免使用Grid控件的一种方法。

但是,如果您想学习,那么编写一个类并尝试理解如何构造该类来控制网格元素的流动就如同在Xaml中编写该类一样,将是一个挑战。我建议您采用此方法的主要原因之一是,通过允许简单的控制为您做事,您将比以往更加了解xaml。

无论如何,在跳伞运动员发消息之后。他问我一些关于如何真正解决他所面临的问题的非常真实的问题。在他的允许下,我将在此处共享一些聊天记录,因为他和我也可能会根据您可能都会问到的一些问题,帮助您了解采取的一些方法。

请记住,我不是WPF的专家,但是我确实在这个平台上工作,并且可以处理客户和个人项目,因此我熟悉自己的出路,并且知道一些巧妙的技巧,但是可能其他一些与此主题有关的开发人员可能会说停止。坚持,稍等;为什么不让他使用堆栈和包裹面板?好吧,如果他愿意的话,他可以使用它们,但这是我建议我们的OP采取这条路线的主要原因之一。是要学习Xaml,并学习如何操作它们在Xaml中开始的结构,并通过制作一个托管类来处理与Grid定义和窗口实际宽度有关的不同变量,从而学会做到这一点,特别是调整大小时。

这是跳伞运动员的引号中的问题(在面板外讨论):

以及如何确定必须创建多少列和行定义。
通过确定控件是否驻留在该列中。当程序的用户添加更多控件时,您将添加更多定义。如果您的窗口没有足够的空间来进行新定义,则别无选择,只能最终添加(我可能会更正),但是要添加ItemsControl,使我们可以使用垂直和水平滚动条,除非我误认为其他控件,但我可以肯定我没有记错。

以及如何确定必须创建多少列和行定义。
通过在Xaml中创建开始的数量,您可以计算数量,在一个类中进行跟踪,然后当用户添加新控件时,您可以添加新的列/行定义,并添加新的控件或片段,再在一个类中跟踪它。

记住我希望他这样做的主要原因是主要学习Xaml,并且因为网格是正确的方法。

If you say, that "没有人,您只需将这些定义硬编码到XAML中",那么您如何处理添加的更多项目或调整窗口大小?
那就是一堂课的目的。这就是循环网格列的目的,并从中收集实际宽度。喜欢 :

C#:
            double t_width = default;
            foreach (ColumnDefinition cd in MyGrid.ColumnDefinitions)
            {
                t_width += cd.ActualWidth;
            }
            Console.WriteLine($"Total Width is @ { t_width }");
本质上,最终您得到所有​​列的总大小,从而可以设置窗口的整体大小。在这一点上,我还应该指出,您没有得到控件的宽度或"fragment" controls in the same way as in windows. While WPF does have a width property, this is not what you want to use as this property is actually used for binding. Width is also a DependencyProperty so it does allow binding and as I said above and it must be set on the UI thread also. It is also worth mentioning that this will not give you the width unless measure is called. You can read more on that one here : UIElement.Measure(Size)方法(System.Windows)

鸡肉和鸡蛋问题:MyGrid.ColumnDefinitions将开始为空,因为我不知道有多少列适合Window。
真的不是问题。如果没有,则从无开始。
如果通过对列进行硬编码使它为非空,则需要确保列和项目的数量将超过Window的大小。
例如。即使定义了100列,但只有一个项目,合适的宽度是多少?相反,如果我仅定义9列,但用户设置了100个固定宽度的窄项目?
宽度是多少?定义?这些定义将仅设置为“自动”。没有其他的。我已经在上面通过使用托管类对每个需要添加到网格的项目添加新的定义来进行管理。通过使用Auto属性,网格定义将按比例处理子控件的大小。

然后我继续指出:
顺便说一句,不要被认为是我谴责您的建议,即使用控件来简化操作方法。众所周知,可以通过这些面板来完成。但是,使用网格来构建该结构,然后在以后添加一个托管类来控制如何向其中添加项目,这是更有趣且更具挑战性的。

我希望我不会错过任何问题,也不会错过应用答案。我很乐意回答任何问题或提供一些基本的示例代码,前提是我还没有其他工作/杂务。记住,我不是聪明人,我没有所有答案。  (y)

编辑:我为一些轻微的错字表示歉意。我整天都在断断续续地拧着这篇文章,终于找到了发布它的时间,我不敢将它们全部修复。
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,532
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果您的窗口没有足够的空间来进行新定义,则别无选择,只能最终添加(我可能会更正),但是要添加ItemsControl,使我们可以使用垂直和水平滚动条,除非我误认为其他控件,但我可以肯定我没有记错。
这easier way to do this is to put the Grid inside a ScrollViewer. The scrollbars will be inserted as needed (or always depending on what attributes you set). See my previous post #19 where ItemsControl is inside a ScrollViewer.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,532
地点
弗吉尼亚州切萨皮克
编程经验
10+
宽度是多少?定义?这些定义将仅设置为“自动”。没有其他的。我已经在上面通过使用托管类对每个需要添加到网格的项目添加新的定义来进行管理。通过使用Auto属性,网格定义将按比例处理子控件的大小。
这"widths"我指的是单个项目的宽度。请参阅帖子#19上的第一个屏幕截图。请注意,每个色板的宽度与颜色名称的长度一样宽。 OP的目标是以表格形式呈现事物,其中所有事物的大小均等。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
The "widths"我指的是单个项目的宽度。
这width of each item or control will be set by the <ColumnDefinition Width="Auto" /> property, and I suspect and expect that any individual size set on any child controls will be or should be ignored with Width="Auto" set. What the auto property does, is; it chooses the correct size for the biggest element in its grid and the control with the most text will be the deciding factor for the total width of that column and all rows beneath it.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,532
地点
弗吉尼亚州切萨皮克
编程经验
10+
是的,是的,这是当项目的宽度不匹配时得到的结果...
Screenshot_1.png


请注意,列宽是不同的。 (我启用了GridLines使其很明显每列有多大。)

XML:
<Window x:Class="Scratch.MainWindow"
        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:Scratch"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <TextBlock Text="Short" Grid.Row="0" Grid.Column="0" />
        <TextBlock Text="Long Passsage" Grid.Row="0" Grid.Column="1" />
        <TextBlock Text="Short Text" Grid.Row="0" Grid.Column="2" />
        <TextBlock Text="3" Grid.Row="1" Grid.Column="0" />
        <TextBlock Text="5" Grid.Row="1" Grid.Column="1" />
        <TextBlock Text="8" Grid.Row="1" Grid.Column="2" />

        <Grid.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Margin" Value="5" />
                <Setter Property="HorizontalAlignment" Value="Center" />
                <Setter Property="VerticalAlignment" Value="Center" />
            </Style>
        </Grid.Resources>
    </Grid>
</Window>
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
那很正常这是使用auto属性的预期结果。最后一列将被拉伸。

你有什么问题?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,532
地点
弗吉尼亚州切萨皮克
编程经验
10+
How do you know how many columns could fit in the window at runtime? From post #27, won't the sum of the ActualWidth's be the same as the window width?

如果另一对文字和数字类似{"Liverpool",,13},您如何确定可以添加另一个列定义并且仍适合Window,而不是确定它们应该是新行?

尽管上面的XAML已对网格位置进行了硬编码,但请记住,最初的问题是动态分配了网格位置。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
From post #27, won't the sum of the ActualWidth's be the same as the window width?
我们的OP并没有像您一样添加3列。他想用控件填充窗口,最好的方法是使用Auto属性。但是,如果您只想添加3列,则最好使用:
C#:
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>

您还可以使用其他属性,但是您需要自己进行实验以找到对您有用的属性。更改定义宽度的结果如下:

截图_61.jpg

如果另一对文字和数字类似{"Liverpool",,13},您如何确定可以添加另一个列定义并且仍适合Window,而不是确定它们应该是新行?
Provide a code example for your question so I can understand what it is you're asking. Regarding : how do you determine that another column definition could be added and still fit in the Window?
This is why one of you needs to start writing a class to handle the actual windows size and to determine how many grid columns have been added and while doing so; you should ascertain whether or not you should use the Auto property or 1* or and to just use 1* for the last column added. 1* will fill the remaining space at the end of the last column.
尽管上面的XAML已对网格位置进行了硬编码,但请记住,最初的问题是动态分配了网格位置。
上面的Xaml用于演示目的,以显示结构外观。当用户决定要向窗口中添加多少控件而不是开发者时,将部分Xaml写出部分结构几乎没有意义。 Xaml显示可以将Grid构造为提供所需的结构,而不需要当前使用的堆叠面板和包装面板。你们俩都可以构造一个类,该类可以动态构建此结构并将其应用于视图。如果可以在Xaml中进行,则可以动态进行。我在主题的前面说过,这将是必不可少的步骤,由于时间紧迫,而且我会付出很多努力,所以我不会写它,但是,如果您想学习,那是一个很棒的跳伞练习。尤其是供将来参考,以防客户像肖恩·塞克斯顿(Sean Sexton)在他的博客上一样受委托。  ;)
 
Last edited:

玻璃杯

知名会员
已加入
2019年11月22日
留言内容
126
编程经验
Beginner
你好!抱歉,我离开了这么长的时间,我经历了一些...事情,最后患上了与压力有关的疾病,并且与这个话题无关!诚实的  :)

在吸收从那以后发布的帖子之前,我只是想说我还没有逃脱,而是将尝试创建一个类来管理该网格。我很快回来。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,532
地点
弗吉尼亚州切萨皮克
编程经验
10+
希望你感觉好些。不用担心 @谢平 我对此进行了旁谈,在他埋头工作的同时,我们也将其搁置了一段时间。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
我一直在拼命地试图复活这个话题。我现在正在进行的事情很多,我几乎无法呼吸工作,无论是个人项目还是新的商业活动,我都没有时间致力于完成用这本书编写Git!我会尽快解决。我希望,也希望您感觉更好。欢迎回来!
 

玻璃杯

知名会员
已加入
2019年11月22日
留言内容
126
编程经验
Beginner
我现在好多了,准备摇摆  (y)

在考虑尝试执行此操作后,我决定最初稍微简化一下目标,我将使用50x50按钮作为网格中的项目,然后使用文本块进行构建,通过这种方式,我可以只使用恒定为50。也许这更容易,也许不是,我不确定,但似乎会。

我对创建专门用于实现此目的的应用程序的最初想法如下(就第一步而言,我知道这还不完整)。
GridManger类将包含诸如项目的宽度/高度之类的字段(在此简化情况下为50,因此我使用了一个Size字段,而不是宽度和高度两个字段),我将其转换为网格单元格的宽度和高度,以及当前的列数和行数。此类需要能够访问主窗口的宽度和高度(以知道应该有多少行/列),并且显然可以访问网格本身。

在具有当前窗口宽度和高度属性的viewmodel中,似乎是必要的,尚不确定此处还会有其他内容,但是我认为随着我的进行,它将变得显而易见。

所以从那里我开始实施它并立即陷入困境  :)

将窗口大小绑定到VM中的属性后,如上所述,我制作了GridManger类,在构造器中,我将调用一种方法来将列和行的数量设置为等于主窗口大小除以50.也许这是错误的方法,我不知道,但是GridManager类没有看到网格(MyGrid),我不知道如何解决这个问题,那就是我碰壁的地方不会再走了。我的想法是从mainwindows resize事件处理程序中再次调用该方法,以执行相同的操作,以根据窗口大小维护正确数量的行/列。或者实际上,该方法调用最好放在VM的窗口width和height属性设置器中。

我也无法从GM引用VM的WindowHeight和WindowWidth属性。我能想到的让GM类看到VM的唯一方法是传递对其构造函数的引用,但是它将范围限制在构造函数上,这将无济于事。

处理范围绝对是我的宿敌。我觉得我做错了  :)

请不要感到急于答复,我不介意等待。
 
最佳 底部