我有这个案例
<WrapPanel>
<CheckBox>Really long name</CheckBox>
<CheckBox>Short</CheckBox>
<CheckBox>Longer again</CheckBox>
<CheckBox>Foo</CheckBox>
<Slider MinWidth="200" />
</WrapPanel>
我希望 WrapPanel 内的所有复选框具有相同的宽度。
添加以下内容就差不多达到想要的效果了
<WrapPanel.Resources>
<Style TargetType="CheckBox" BasedOn="{StaticResource {x:Type CheckBox}}">
<Setter Property="MinWidth" Value="75" />
</Style>
</WrapPanel.Resources>
但是,我不想硬编码特定宽度,而是让最大的 CheckBox 设置宽度(如果任何宽度 > 75,上面的方法也会失败)。
滑块是独立的,应允许大于复选框。
我不想使用网格(带有 IsSharedSizeScope),因为我不需要硬编码的列数。
本文提出了一个有趣的解决方案,但如果不创建自定义控件或使用 C# 代码来解决问题,那就太好了。
执行此操作的最佳方法是什么(最好仅在 XAML 中)?
我最初使用 IsSharedSizeGroup 来查看此问题,但遇到了使其动态应用于事物而不是显式包装项目的障碍。在这种情况下,从长远来看,在代码或其他基于代码的解决方案中创建 AttachedProperty 可能比仅使用 XAML 的方法更好。但是,要创建纯 XAML 解决方案,我们可以使用共享大小组ColumnDefinition 上的属性来共享每个元素的大小,然后使用设置共享大小范围WrapPanel 上的属性。这样做将使 WrapPanel 中具有相同 SharedSizeGroup 的所有内容共享其列宽和行高。要包装 ComboBox 以及可能当前不在 XAML 中但将添加到 WrapPanel 中的 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>
在这里,我们将 WrapPannel 内没有样式的所有复选框重新模板化为由网格包围的复选框。然而,正因为如此,我们需要重新绑定我们想要维护的所有 CheckBoxes 属性。虽然这可能会变得很麻烦,但它也允许使用纯 XAML 方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)