【问题标题】:Grid's SharedSizeGroup and * sizingGrid 的 SharedSizeGroup 和 * 大小
【发布时间】:2011-06-07 12:47:29
【问题描述】:

我有一个用户控件,叫它UserControl,它有一个带有以下列定义的网格:

<Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition Width="Auto" SharedSizeGroup="B"/>
            <ColumnDefinition Width="*" SharedSizeGroup="C"/>
            <ColumnDefinition Width="Auto" SharedSizeGroup="D"/>
            <ColumnDefinition MinWidth="30" Width="*" SharedSizeGroup="E"/>
            <ColumnDefinition MinWidth="30" Width="*" SharedSizeGroup="F"/>
            <ColumnDefinition Width="110" SharedSizeGroup="G"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="H"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="I"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="J"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="K"/>
            <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="L"/>
</Grid.ColumnDefinitions>

我还有MainWindow,它本身包含一个网格,并在网格上定义了以下属性:

Grid.IsSharedSizeScope="True"

现在,我在MainWindow 的网格中添加了几个用户控件(每个都添加到单独的行)。我的目标是让不同用户控件的每个列宽保持同步。使用SharedSizeGroup 时一切正常,除了一件事。似乎任何宽度为 * 的列都没有表现出应有的行为。看起来* 列宽设置为好像它们是Auto

SharedSizeGroup* 的大小调整是否有任何限制/问题?这似乎是保持列宽同步的最佳方法,但我似乎无法解决此问题。

谢谢。

【问题讨论】:

    标签: wpf xaml layout wpf-controls grid


    【解决方案1】:

    DefinitionBase.SharedSizeGroup Property (Microsoft Docs):

    参与的列和行 分摊不尊重明星 浆纱。在大小共享场景中, 星号大小被视为自动

    如果您使用星号,则所有列的宽度都相同,因此如果您不介意自动调整大小方面,则应为所有列分配相同的 SharedSizeGroup

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
        <ColumnDefinition Width="Auto" SharedSizeGroup="B"/>
        <ColumnDefinition Width="*" SharedSizeGroup="StarDontWork"/>
        <ColumnDefinition Width="Auto" SharedSizeGroup="D"/>
        <ColumnDefinition MinWidth="30" Width="*" SharedSizeGroup="StarDontWork"/>
        <ColumnDefinition MinWidth="30" Width="*" SharedSizeGroup="StarDontWork"/>
        <ColumnDefinition Width="110" SharedSizeGroup="G"/>
        <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="H"/>
        <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="I"/>
        <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="J"/>
        <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="K"/>
        <ColumnDefinition MinWidth="30" Width="Auto" SharedSizeGroup="L"/>
    </Grid.ColumnDefinitions>
    

    (从这种行为也可以看出,当设置了SharedSizeGroup 时,您可以删除Width 属性)


    您可以推断,如果所有自动调整大小的列都在共享大小组中,那么所有按星形调整大小的列将具有相同的大小,因为范围内的每个网格将具有相同数量的未使用空间,这些空间将分配给星形- 大小的列。

    一个简单的例子:

    <Grid.ColumnDefinitions>
        <ColumnDefinition SharedSizeGroup="A"/>
        <ColumnDefinition SharedSizeGroup="B" Width="*"/>
        <ColumnDefinition SharedSizeGroup="C"/>
    </Grid.ColumnDefinitions>
    

    正如所解释的,Width="*" 不会做任何事情,但由于列 02 已同步,列 1 也必须同步,因此您可以删除 SharedSizeGroup

    <Grid.ColumnDefinitions>
        <ColumnDefinition SharedSizeGroup="A"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition SharedSizeGroup="C"/>
    </Grid.ColumnDefinitions>
    

    【讨论】:

    • 感谢您的链接。不幸的是,将 * 列设置为使用不同的 SharedSizeGroup 将导致所有这些列的宽度同步(这是预期的),但不是我想要的。我需要单独同步每个列宽。
    • 我的建议是正是明星通常会做的事情,我没有得到你想要的......
    • 对此要非常小心。因此,我的应用程序无所事事地消耗了一个 CPU 内核的 100%。一旦我删除了“SharedSizeGroup”,它就会消耗 0,正如预期的那样。
    • @AlexeiOst:我假设 Grid 的内容一直在变化?如果不是那将是非常可怕的,如果没有布局更新,则不需要 CPU 使用。
    • 不一定。我刚刚遇到一个案例,在设计器中显示的布局预览陷入了“无限循环更新”:来 3 列被分配了相同的 sharedsizegroup 和一些它们也有Width=*,并且预览用尺寸渲染它们,比如说:10,10,30,然后立即用尺寸10,30,10重新绘制,然后重新绘制到10,10,30,然后是 10、30、10,依此类推。我可以轻松地向您保证,幕后没有任何变化,只是简单的布局预览。我假设如果我用这个运行那个应用程序,它会像@AlexeiOst 所说的那样旋转。
    猜你喜欢
    • 2019-06-19
    • 2016-05-17
    • 2019-03-20
    • 2014-01-24
    • 2011-09-18
    • 2014-04-15
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多