我创建了一个带有orientation属性的UserControl。 所有的定位工作都应该由内部堆栈面板完成,所以我将它绑定到属性。
这在运行时工作正常,但WPF设计器显示堆栈面板的默认值(垂直)而不是orientation属性的默认值(水平)。
这是简化的例子。 XAML:
<UserControl x:Class="MyWpf.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:MyWpf="clr-namespace:MyWpf"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<StackPanel Orientation="{Binding Path=Orientation, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyWpf:MyUserControl}}}">
<TextBlock>A</TextBlock>
<TextBlock>B</TextBlock>
<TextBlock>C</TextBlock>
</StackPanel>
</UserControl>
代码背后:
public partial class MyUserControl : UserControl
{
public static readonly DependencyProperty OrientationProperty;
static MyUserControl()
{
OrientationProperty = DependencyProperty.Register( "Orientation", typeof( Orientation ), typeof( MyUserControl ), new FrameworkPropertyMetadata( Orientation.Horizontal ) );
}
public Orientation Orientation
{
get
{
return (Orientation)GetValue( OrientationProperty );
}
set
{
SetValue( OrientationProperty, value );
}
}
public MyUserControl()
{
InitializeComponent();
}
}
我看到的唯一解决方案是将Orientation包含到ViewModel中(并使用DesignData),但我希望它是干净的。我希望有类似DesignData的东西,但对于控件本身。
答案 0 :(得分:0)
也许这可以帮助
What approaches are available to dummy design-time data in WPF?
我猜你可以尝试在d:Orientation
上设置StackPanel
。
大多数Binding扩展在运行时都有用(有时你需要它,有些时候是在编译时)。我不是100%,但你可以试试{Binding ElementName=_userControl, Path=Orientation}
- 但即使它“有效”,我也不认为这对你有用,因为那是你的自定义属性。
这是一个关于类似的东西的链接,它解释了一下(但对你的情况没有帮助) WPF TemplateBinding vs RelativeSource TemplatedParent