gpt4 book ai didi

wpf - 如何通过属性改变 UserControl 的布局?

转载 作者:行者123 更新时间:2023-12-04 03:11:35 26 4
gpt4 key购买 nike

我做了我能做的最小的项目来证明这个问题:

代码隐藏:

public partial class AxisControl : UserControl
{
public static readonly DependencyProperty LayoutProperty =
DependencyProperty.Register("Layout", typeof(Orientation), typeof(AxisControl),
new PropertyMetadata(Orientation.Horizontal));

public Orientation Layout
{
get { return (Orientation)GetValue(LayoutProperty); }
set { SetValue(LayoutProperty, value); }
}

public AxisControl()
{
InitializeComponent();
}
}

Xaml:

<UserControl.Resources>
<ContentControl x:Key="horizontalLayout" Height="60">
<TextBlock Text="{Binding Layout, RelativeSource={RelativeSource AncestorType=UserControl}}" HorizontalAlignment="Center" VerticalAlignment="Bottom"/>
</ContentControl>
<ContentControl x:Key="verticalLayout" Width="60">
<TextBlock Text="{Binding Layout, RelativeSource={RelativeSource AncestorType=UserControl}}" HorizontalAlignment="Left" VerticalAlignment="Center">
<TextBlock.LayoutTransform>
<RotateTransform Angle="-90"/>
</TextBlock.LayoutTransform>
</TextBlock>
</ContentControl>
</UserControl.Resources>
<UserControl.Style>
<Style TargetType="UserControl">
<Style.Setters>
<Setter Property="Content" Value="{StaticResource horizontalLayout}"/>
</Style.Setters>
<Style.Triggers>
<DataTrigger Binding="{Binding Layout, ElementName=root}" Value="Vertical">
<Setter Property="Content" Value="{StaticResource verticalLayout}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Style>

编辑:Xaml 现在包含我想要在 UserControl 中排列的元素。

主窗口 Xaml:

<Grid>
<local:AxisControl Layout="Vertical"/>
</Grid>

我的想法是根据其 Layout 属性设置 UserControl 的布局,因此我将两个布局都放在静态资源中,并根据类型为 Orientation 的 Layout 制作了一个 Style 以将内容设置为我想要的布局。

编辑:我希望内容包含根据方向以不同顺序排列的元素。

UserControl 显示正确,但输出窗口中出现错误,这与我有关:

Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''. BindingExpression:Path=Layout; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

这是否意味着它在可能来自触发器的可视化树中之前尝试进行绑定(bind)?

请注意在绑定(bind)中使用 RelativeSource 和 ElementName,因为在 UserControl 的根设置 DataContext 是不正确的,因为它会破坏 DataContext 继承。

我做错了什么以及如何消除错误?

最佳答案

受到 Clemens 评论和进一步研究的启发,我意识到我需要为每个布局提供一个 ControlTemplate 资源,而不是包含元素本身实例的资源。

<UserControl.Resources>
<ControlTemplate x:Key="horizontalLayout">
<Border Height="60" Background="LightBlue">
<TextBlock Text="{Binding Layout, RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Center" VerticalAlignment="Bottom"/>
</Border>
</ControlTemplate>
<ControlTemplate x:Key="verticalLayout" TargetType="UserControl">
<Border Width="60" Background="LightBlue">
<TextBlock Text="{Binding Layout, RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Left" VerticalAlignment="Center">
<TextBlock.LayoutTransform>
<RotateTransform Angle="-90"/>
</TextBlock.LayoutTransform>
</TextBlock>
</Border>
</ControlTemplate>
</UserControl.Resources>
<UserControl.Style>
<Style TargetType="UserControl">
<Style.Setters>
<Setter Property="Template" Value="{StaticResource horizontalLayout}"/>
</Style.Setters>
<Style.Triggers>
<DataTrigger Binding="{Binding Layout, ElementName=root}" Value="Vertical">
<Setter Property="Template" Value="{StaticResource verticalLayout}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Style>

布局=水平

Layout = Orientation.Horizontal

布局=垂直

enter image description here

关于wpf - 如何通过属性改变 UserControl 的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44868378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com