代码之家  ›  专栏  ›  技术社区  ›  Klas Mellbourn

在WrapPanel中同步WPF控件宽度

  •  3
  • Klas Mellbourn  · 技术社区  · 15 年前

    <WrapPanel>
        <CheckBox>Really long name</CheckBox>
        <CheckBox>Short</CheckBox>
        <CheckBox>Longer again</CheckBox>
        <CheckBox>Foo</CheckBox>
        <Slider MinWidth="200" />
    </WrapPanel>
    

    我希望包装内的所有复选框宽度相同。

    <WrapPanel.Resources>
        <Style TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
            <Setter Property="MinWidth" Value="75" />
        </Style>
    </WrapPanel.Resources>
    

    滑块是独立的,应允许其大于复选框。

    我不想使用网格(带有IsSharedSizeScope),因为我不想要硬编码的列数。

    This article 提供了一个有趣的解决方案,但如果不创建自定义控件或使用C#代码就可以解决问题,那就太好了。

    3 回复  |  直到 15 年前
        1
  •  9
  •   Daniel Sam    10 年前

    SharedSizeGroup 属性共享每个元素的大小,然后使用 IsSharedSizeScope

    <WrapPanel Grid.IsSharedSizeScope="True">
      <WrapPanel.Resources>
        <Style TargetType="{x:Type CheckBox}">
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="{x:Type CheckBox}">
                <Grid Background="LightBlue">
                  <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="WrapPannelGroup" />
                  </Grid.ColumnDefinitions>
                  <CheckBox Style="{x:Null}"
                            IsChecked="{TemplateBinding IsChecked}">
                    <!--Other TemplateBindings-->
                    <CheckBox.Content>
                      <ContentPresenter />
                    </CheckBox.Content>
                  </CheckBox>
                </Grid>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
    
      </WrapPanel.Resources>
      <CheckBox>Really long name</CheckBox>
      <CheckBox>Short</CheckBox>
      <CheckBox IsChecked="True">Longer again</CheckBox>
      <CheckBox>Foo</CheckBox>
      <Slider MinWidth="200" />
    </WrapPanel>
    

    在这里,我们正在重新模板化所有在WrapPannel中没有样式的复选框,使其成为由网格包围的复选框。但是,正因为如此,我们需要重新绑定所有要维护的复选框属性。虽然这可能会变得很麻烦,但它也允许使用纯XAML方法。

        2
  •  1
  •   John Fisher    15 年前

    可以添加执行所需工作的属性或转换器,然后将每列的宽度绑定到该属性或转换器。属性或转换器可以访问整个项目列表,找到最宽的项目,并返回所有元素所需的宽度。

        3
  •  0
  •   micahtan    15 年前

    最好的方法是使用CustomControl,如您发布的文章。

    您遇到的任何解决方案都必须遍历项目列表,并在度量阶段找到最大宽度。

    任何种类的XAML唯一答案都必须提供OOTB(例如IsSharedSizeScope),或者利用某种多重绑定将项目链接在一起。因此,任何种类的XAML答案都会充满标记,这使得它更加冗长(也不那么优雅)。

    我看到的对您发布的CodeProject文章的唯一修改是添加了“关闭”对某些元素(如滑块)的考虑的功能。这可以作为附加属性来完成。