WPF usercontrol中对齐的覆盖属性未按预期工作

时间:2016-04-29 08:28:06

标签: c# wpf xaml

我在这个时间编程一些WPF UserControls(没有CustomControls!) - 由一些嵌套控件组成 - 并在UserControl的CS文件中覆盖一些继承的属性,如Horizo​​ntalContentAlignment with& #34;新&#34 ;. 一般来说,我的用户控件由一个边框组成,每个例子中都有一个带有TextBlock作为内容的Label(用于文本包装的可能性)。 除对齐外,所有属性都运行良好。 只要我使用自己的属性p.e. " ControlHorizo​​ntalContentAlignment"它按预期工作:标签填充边框,TextBlock是p.e.在右下角。 但是现在覆盖了Horizo​​ntalContentAlignment,Label不再填充Border控件。

似乎存在覆盖像Horizo​​ntalContentAlignment这样的属性的问题。 我该如何处理这个问题?

我对Label的UserControl在XAML中定义如下:

<UserControl x:Class="UsercontrolExample.UserControls.ControlLabel"
             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:local="clr-namespace:UsercontrolExample.UserControls"
             mc:Ignorable="d"
             d:DesignHeight="30"
             d:DesignWidth="150">
    <Grid x:Name="LayoutRoot">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Border x:Name="border"
                Style="{StaticResource usercontrolBorderStyle}">
            <Label x:Name="label" Background="Yellow" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
                   Margin="2">
                <TextBlock x:Name="textblock" Background="Orange"
                           Text="Label Label"
                           TextWrapping="Wrap"/>
            </Label>
        </Border>
    </Grid>
</UserControl>

资源usercontrolBorderStyle:

<Style x:Key="usercontrolBorderStyle">
    <Setter Property="Border.BorderBrush" Value="RoyalBlue"/>
    <Setter Property="Border.BorderThickness" Value="1"/>
    <Setter Property="Border.HorizontalAlignment" Value="Stretch"/>
    <Setter Property="Border.VerticalAlignment" Value="Stretch"/>
</Style>

这是被覆盖的属性:

public new HorizontalAlignment HorizontalContentAlignment
{
    get { return Converter.ConvertTextAlignmentToHorizontalAlignment(textblock.TextAlignment); }
    set {textblock.TextAlignment = Converter.ConvertHorizontalAlignmentToTextAlignment(value); }
}

这是我自己的原创财产:

public HorizontalAlignment ControlHorizontalContentAlignment
{
    get { return label.HorizontalContentAlignment; }
    set
    {
        label.HorizontalContentAlignment = value;
        textblock.TextAlignment = Converter.ConvertHorizontalAlignmentToTextAlignment(value);
    }
}

提前致谢!

1 个答案:

答案 0 :(得分:0)

隐藏Horizo​​ntalContentAlignment属性(new HorizontalAlignment HorizontalContentAlignment)并不是一个好主意。我认为你可以避免这种情况,如果使用正确的绑定(需要新的转换器)

<UserControl x:Class="UsercontrolExample.UserControls.ControlLabel"
             x:Name="myLabel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid x:Name="LayoutRoot">
        ...
        <TextBlock x:Name="textblock" Background="Orange"
                   Text="Label Label"
                   HorizontalAlignment="Stretch"
                   TextAlignment="{Binding HorizontalContentAlignment, 
                                   ElementName=myLabel, 
                                   Converter={StaticResource HorizontalToText}}"
                   TextWrapping="Wrap"/>
    </Grid>
</UserControl>

HorizontalToText是存储在Resources

中的转换器实例

转换器示例:WPF binding HorizontalAlignment to TextAlignment