我为自定义面板声明了附加属性:
public static readonly DependencyProperty WeightProperty = DependencyProperty.RegisterAttached(
"Weight", typeof(double), typeof(WeightedPanel),
new FrameworkPropertyMetadata(1.0,
FrameworkPropertyMetadataOptions.AffectsParentMeasure |
FrameworkPropertyMetadataOptions.AffectsParentArrange ));
public static void SetWeight(DependencyObject obj, double weight)
{
obj.SetValue(WeightProperty, weight);
}
public static double GetWeight(DependencyObject obj)
{
return (double) obj.GetValue(WeightProperty);
}
如果我将面板定义为:
,它可以正常工作<local:WeightedPanel Grid.Row="0" Height="200">
<Button local:WeightedPanel.Weight="8" />
<Button local:WeightedPanel.Weight="2"/>
</local:WeightedPanel>
但如果我将此面板用作ItemsPanelTemplate
ListBox
,则它始终会返回ArrangeOverride
中的默认值。
<ListBox Grid.Row="2" Height="100">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<local:WeightedPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<Button local:WeightedPanel.Weight ="6" />
<Button local:WeightedPanel.Weight ="4"/>
</ListBox>
我还注意到,当在ListBox
中使用自定义包装面板时,它会在Arrange方法中发送double.PositiveInfinite
,因此Arrange永远不能设置值。当单独使用时,同样的工作正常
由于
答案 0 :(得分:0)
即使我尝试了同样的东西,但它在其他面板形式中对我没有用,我想设置网格,但它没有用。
问题是,由于ListBox只能将ListBoxItem作为其真正的逻辑子,而不是任何Button等,当你在ListBox的内容窗格中添加Button或任何项目时,当它执行时,ItemsPanel将其直接子项作为ListBoxItem和ListBoxItem的内容将是您添加的控件。
所以在运行时这将是你的视觉树......
ItemsControl (ListBox)
ItemsPanel (WeightedPanel)
ListBoxItem
Button
ListBoxItem
Button...
这是您附加财产无效的原因。
解决方案是,您尝试将ItemContainerStyle中的ListBoxItem属性设置为DataContext的WeightedPanel.Weight。我知道它令人困惑。
OR
您可以将ListBoxItem添加为子项..如
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<local:WeightedPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBoxItem local:WeightedPanel.Weight="4"><Button/></ListBoxItem>
<ListBoxItem local:WeightedPanel.Weight="4"><Button/></ListBoxItem>
</ListBox>