比如上面这张图,右下角是一个红色的三角,感谢
现在使用的笨办法,把textblock和图片放在grid同一个单元格内
<Grid>
<TextBlock Text="{Binding csny}"></TextBlock>
<Image HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="8" Height="8" Source="images/error.png" Visibility="{Binding da_cssj_7, Converter={StaticResource ErrorConverter}}"></Image>
</Grid>
但是用了这种办法,页面加载和渲染速度好像慢了很多,还有其它更好的办法吗?
到目前为止,没有更好的办法
编辑模板,在模板里添加
<TextBlock Text="1002.57" TextAlignment="Center" FontSize="40">
<Path Stroke="Red" StrokeThickness="1" Fill="Red">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="10,0">
<PolyLineSegment Points="10,0 10,10 0,10 10,0"></PolyLineSegment>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
</TextBlock>
这种方法我试了一下,不能设置Text值,如果设置了,就不会显示三角形
@duxer: 这个例子就设置了Text值啊,你的TextBlock的宽高是自动大小的吗,固定大小的就可能显示不出来。
@左眼水星: TextBlock的大小是自动的
直接编辑textblock的样式比较方便,还可以复用
1.重写(模版),找出现有元素补充。
2.直接background,贴一个三角形搞定。
上述(模版代码都可以)
3.再建组合
eg.
public class TextBoxForWatermark : TextBoxEx
{
public virtual Brush DefaltBrush { get; set; }
public virtual VisualBrush WatermarkBrush { get; set; } = new VisualBrush(new IconBox() { Foreground = ThemeDefine.Default.Primary0.ToColorBrush(), IconVal = 0XF004 }) { AlignmentX = AlignmentX.Left, AlignmentY = AlignmentY.Top, Stretch = Stretch.None };
public override void OnApplyTemplate()
{
DefaltBrush = Background;
base.OnApplyTemplate();
Background = (!string.IsNullOrEmpty(Text) && Text.Length > 0) ? DefaltBrush : WatermarkBrush;
}
protected override void OnTextChanged(TextChangedEventArgs e)
{
base.OnTextChanged(e);
Background = (!string.IsNullOrEmpty(Text) && Text.Length > 0) ? DefaltBrush : WatermarkBrush;
}
}
/// <summary>
/// TextBoxExtWm.xaml 的交互逻辑
/// </summary>
public partial class TextBoxEx
{
public TextBoxEx()
{
InitializeComponent();
MaxLength = 200;
}
private int _radiusEx = 5;
public int RadiusEx
{
get { return _radiusEx; }
set
{
_radiusEx = value;
Radius = new CornerRadius(value);
}
}
public CornerRadius Radius
{
get => _border?.CornerRadius ?? new CornerRadius(0);
set { if (_border != null) _border.CornerRadius = value; }
}
protected Border _border;
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_border = GetTemplateChild("border").ToType<Border>();
RadiusEx = RadiusEx;
}
}
是个懒人,所以除非必要 坚决不用 依赖属性。简单类型属性,xmal都是认的。
<TextBox Width="100" Height="50">
<TextBox.Template>
<ControlTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Width="100" Height="40" Background="Red"> </TextBlock>
<Image Source="/Image/退出.png" HorizontalAlignment="Right" Height="10" Width="10"></Image>
</StackPanel>
</ControlTemplate>
</TextBox.Template>
</TextBox>
吧图片换成一个三角形的图片就行了,大小这些都可以自己定义
这种方法图片会占用单元格的空间,文字在排版的时候不好控制,比如上下居中时,是把图片的高度减去后再居中
使用CheckBox或者Button,然后重写模板,在模板里面画上角标。