2012-03-08 147 views
0

我需要一个控件,就像WPF中的Label。但这个标签应该始终自动调整
(宽度=高度=自动) - 用户不应该能够修改它。继承和限制

另外,BorderThinkness应始终为0

我怎样才能做到这一点在WPF? 是否有可能继承这样的标签,以便孩子们保存该属性(总是自动化)?

+0

据我知道你Ç从Label创建一个CustomControl继承。我还没有在WPF中构建CustomControls(但在ASP.NET中可以这样做)。否则,可能会创建自己的控件:[在WPF中创建一个不太自定义的控件](http://www.codeproject.com/Articles/14340/Creating-a-look-less-custom-control-in-WPF) – Nicholas 2012-03-08 15:22:40

+0

@尼古拉斯的问题很火如何创建,问题是如何实现宽度和高度的非修改。是否应该通过overloadind或Shadowing Wifdth,Height,BorderThickness属性?... – serhio 2012-03-08 15:27:03

+0

我的第一个猜测是如果您仍然想要以只读模式访问底层基类的值,则只需使它们为只读。如果你尝试在xaml中设置它们,它会产生一个编译器错误。所以你将不得不影射这些属性 – Nicholas 2012-03-09 08:24:07

回答

0

做一个用户控件,它包装标签,并会有限制
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); 
         } 
        }))); 
     } 
    } 

我只是做它,所以它可能会需要一些调试,但你的想法;)

+0

是啊......我将不得不通过依赖属性公开所有其他属性......但也许只是在继承Label的新CustomControl中重载宽度和高度属性? – serhio 2012-03-08 15:25:44

+0

不幸的是,你不能超载这些属性 – 2012-03-08 15:48:16

+0

@serhio请参阅我编辑的答案。 – 2012-03-08 16:00:39

1

宽度和高度设置器都最终通过调用虚拟SetBoundsCore方法应用边界修改。重写此方法应该可能是您提出的修改的首选候选方法。

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> 
+0

这将适用于该类,但...问题的标题是“继承和限制”,所以我恐怕我可以不会继承风格。 – serhio 2012-03-09 08:13:37