Kla*_*urn 3 wpf layout xaml wrappanel itemscontrol
我有这个案子
<WrapPanel>
<CheckBox>Really long name</CheckBox>
<CheckBox>Short</CheckBox>
<CheckBox>Longer again</CheckBox>
<CheckBox>Foo</CheckBox>
<Slider MinWidth="200" />
</WrapPanel>
Run Code Online (Sandbox Code Playgroud)
我希望WrapPanel内的所有CheckBox都是相同的宽度.
添加以下内容几乎可以实现所需的效果
<WrapPanel.Resources>
<Style TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
<Setter Property="MinWidth" Value="75" />
</Style>
</WrapPanel.Resources>
Run Code Online (Sandbox Code Playgroud)
但是,我不想硬编码特定的宽度,而是让最大的CheckBox设置宽度(如果任何宽度> 75,上面也会失败).
Slider是独立的,应该允许比CheckBox更大.
我不想使用网格(使用IsSharedSizeScope),因为我不想要硬编码的列数.
本文提供了一个有趣的解决方案,但如果不创建自定义控件或使用C#代码就可以解决问题.
最好的方法是什么,最好只在XAML中使用?
我最初使用IsSharedSizeGroup看了这个,但遇到了一个障碍,它使动态应用于事物而不是显式包装项目.在这种情况下,在代码中创建AttachedProperty或其他基于代码的解决方案从长远来看可能比仅XAML方法更好.但是,要创建纯XAML解决方案,我们可以利用ColumnDefinition上的SharedSizeGroup属性来共享每个元素的大小,然后在WrapPanel上使用设置IsSharedSizeScope属性.这样做会使WrapPanel中具有相同SharedSizeGroup的所有内容共享其行的宽度和行的高度.要包装当前不在XAML中但将被添加到WrapPanel的ComboBox和可能的ComboBox,我们可以创建一个Style并重新模板化ComboBox,以便用Grid进行贝司包装.
<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>
Run Code Online (Sandbox Code Playgroud)
在这里,我们重新模板化所有CheckBoxes而没有WrapPannel中的样式,而是由Grid包围的CheckBoxes.但是,因此我们需要重新绑定我们想要维护的所有CheckBoxes属性.虽然这可能会变得很麻烦,但它也允许采用纯XAML方法.