我有一个可以停靠在DockPanel内部左侧或右侧的StackPanel。 StackPanel中的项目应该像祖先一样停靠在同一侧。对于测试,我在Visual Tree中获取了祖先的名称,但我不知道如何绑定到Docking.Dock。提前致谢。
<DockPanel>
<StackPanel x:Name="RightHandContainer" DockPanel.Dock="Right">
<v:MyUsercontrol TextCaption="Hard-Coded Alignment Works" Alignment="Right" />
<v:MyUsercontrol TextCaption="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel, AncestorLevel=1}, Path=Name}"
Alignment="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel, AncestorLevel=1}, Path=Docking.Dock}" />
<!-- TextCaption is is a dependencyproperty of Type string, works fine ... my Text object automatically gets 'RightHandContainer' -->
<!-- Alignment is is a dependencyproperty of Type Dock, like Docking.Dock ... Binding will not work :( -->
</StackPanel>
</DockPanel>
答案 0 :(得分:0)
一种方法是创建一个值转换器。将属性绑定到stackpanel本身,并抓住valueconverter中的dock并返回您需要的任何内容。像这样:
<Window.Resources>
<app:TestConverter x:Key="TestConverter" />
</Window.Resources>
<DockPanel>
<StackPanel x:Name="RightHandContainer" DockPanel.Dock="Right">
<TextBlock Text="Test" HorizontalAlignment="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel, AncestorLevel=1}, Converter={StaticResource TestConverter}}" />
</StackPanel>
</DockPanel>
转换器:
public class TestConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
HorizontalAlignment alignment = HorizontalAlignment.Left;
StackPanel stackPanel = value as StackPanel;
if (stackPanel != null)
{
Dock dock = DockPanel.GetDock(stackPanel);
switch (dock)
{
case Dock.Left: alignment = HorizontalAlignment.Left; break;
case Dock.Right: alignment = HorizontalAlignment.Right; break;
}
}
return alignment;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我使用了水平对齐,但你可以返回任何你需要的东西。