我需要一个控件,就像WPF中的Label一样。但是这个标签应该始终自动化 (宽度=高度=自动) - 用户不应该修改它。
BorderThinkness也应始终为= 0。
如何在WPF中执行此操作? 是否可以继承这样的标签,以便孩子们保留该属性(总是自动调整大小)?
答案 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>