我需要一个控件,就像WPF中的Label。但这个标签应该始终自动调整
(宽度=高度=自动) - 用户不应该能够修改它。继承和限制
另外,BorderThinkness应始终为0
我怎样才能做到这一点在WPF? 是否有可能继承这样的标签,以便孩子们保存该属性(总是自动化)?
我需要一个控件,就像WPF中的Label。但这个标签应该始终自动调整
(宽度=高度=自动) - 用户不应该能够修改它。继承和限制
另外,BorderThinkness应始终为0
我怎样才能做到这一点在WPF? 是否有可能继承这样的标签,以便孩子们保存该属性(总是自动化)?
做一个用户控件,它包装标签,并会有限制
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);
}
})));
}
}
我只是做它,所以它可能会需要一些调试,但你的想法;)
是啊......我将不得不通过依赖属性公开所有其他属性......但也许只是在继承Label的新CustomControl中重载宽度和高度属性? – serhio 2012-03-08 15:25:44
不幸的是,你不能超载这些属性 – 2012-03-08 15:48:16
@serhio请参阅我编辑的答案。 – 2012-03-08 16:00:39
宽度和高度设置器都最终通过调用虚拟SetBoundsCore方法应用边界修改。重写此方法应该可能是您提出的修改的首选候选方法。
您是否考虑过应用程序范围内的资源字典并定义样式?定义一次,无论你需要它,你都可以使用<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>
这将适用于该类,但...问题的标题是“继承和限制”,所以我恐怕我可以不会继承风格。 – serhio 2012-03-09 08:13:37
据我知道你Ç从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
@尼古拉斯的问题很火如何创建,问题是如何实现宽度和高度的非修改。是否应该通过overloadind或Shadowing Wifdth,Height,BorderThickness属性?... – serhio 2012-03-08 15:27:03
我的第一个猜测是如果您仍然想要以只读模式访问底层基类的值,则只需使它们为只读。如果你尝试在xaml中设置它们,它会产生一个编译器错误。所以你将不得不影射这些属性 – Nicholas 2012-03-09 08:24:07