继承和限制

时间:2012-03-08 14:05:16

标签: c# .net wpf vb.net wpf-controls

我需要一个控件,就像WPF中的Label一样。但是这个标签应该始终自动化 (宽度=高度=自动) - 用户不应该修改它。

BorderThinkness也应始终为= 0。

如何在WPF中执行此操作? 是否可以继承这样的标签,以便孩子们保留该属性(总是自动调整大小)?

3 个答案:

答案 0 :(得分:1)

Width和Height setter最终都通过调用虚拟SetBoundsCore方法来应用边界修改。覆盖这种方法应该是你提出修改的首选候选方法。

答案 1 :(得分:0)

创建一个包装标签的UserControl和硬编码 Width = Height = Auto

BorderThickness = 0

类似的东西:

<UserControl ...>
   <Label Width="Auto" Height="Auto" BorderThickness="0" />
</UserControl>

当然,你必须通过依赖属性公开其他属性。

编辑:(在黑暗中拍摄)

你可以尝试一下:

public class NewLabel : Label
    {
        private readonly object m_AutoValue;

        public NewLabel()
        {
            m_AutoValue = base.GetValue(NewLabel.HeightProperty);

            NewLabel.HeightProperty.OverrideMetadata(typeof(NewLabel), new PropertyMetadata(
                new PropertyChangedCallback(
                    (dpo, dpce) =>
                    {
                        if (!dpce.NewValue.Equals(m_AutoValue))
                        {
                            ((NewLabel)dpo).ClearValue(Label.HeightProperty);
                        }
                    })));
        }
    }

我刚刚完成它所以它可能需要一些调试,但你明白了;)

答案 2 :(得分:0)

您是否考虑过拥有应用程序范围的资源字典并定义样式?定义一次,您可以在任何需要的地方使用<Label Style="{StaticResource ResourceKey=AutoSizeLabel}" />

在AppResources.xaml中:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    >
    <Style x:Key="AutoSizeLabel" TargetType="{x:Type Label}">
        <Setter Property="Width" Value="Auto" />
        <Setter Property="Height" Value="Auto" />
        <Setter Property="BorderThickness" Value="0" />
    </Style>
</ResourceDictionary>

在App.xaml中

    <Application.Resources>
        <ResourceDictionary Source="AppResources.xaml" />
    </Application.Resources>

在MainWindow.xaml

<Grid>
    <Label Style="{StaticResource ResourceKey=AutoSizeLabel}">MyLabel</Label>
</Grid>