c#wpf文本块

c#wpf文本块,c#,wpf,textblock,C#,Wpf,Textblock,我需要在文本块的字母之间留出34的空间。 文本块具有字体拉伸属性的属性 但它有自己的(超扩展、浓缩等) 我想将此“超级扩展”属性更改为34 有什么解决方案吗?我相信您可以自己尝试找出答案,但显然您无法评估-10到FontStretch属性,因为该属性只接受一组选项作为输入值。 您要查找的选项可能是fontstraints.ExtraCondensed。我建议您转到MSDN阅读:您可以尝试以下内容: public class AdvancedStretchTextBlock : TextBlo

我需要在文本块的字母之间留出34的空间。
文本块具有字体拉伸属性的属性
但它有自己的(超扩展、浓缩等)


我想将此“超级扩展”属性更改为34
有什么解决方案吗?

我相信您可以自己尝试找出答案,但显然您无法评估
-10
FontStretch
属性,因为该属性只接受一组选项作为输入值。 您要查找的选项可能是
fontstraints.ExtraCondensed
。我建议您转到MSDN阅读:

您可以尝试以下内容:

public class AdvancedStretchTextBlock : TextBlock
{
    /// <summary>
    /// Defines charachter/letter spacing
    /// </summary>
    public int Tracking
    {
        get => (int)GetValue(TrackingProperty);
        set => SetValue(TrackingProperty, value);
    }

    public static readonly DependencyProperty TrackingProperty =
        DependencyProperty.Register("Tracking", typeof(int), typeof(AdvancedStretchTextBlock),
            new UIPropertyMetadata(0,
                TrackingPropertyChanged));

    static void TrackingPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        if (!(o is AdvancedStretchTextBlock tb) || String.IsNullOrEmpty(tb.Text))
            return;

        tb._tracking.X = (int)e.NewValue;
        tb._trackingAlignment.X = -(int)e.NewValue * tb.Text.Length;

        if (tb._lastTrackingTextLength == tb.Text.Length)
            return; // Avoid re-creating effects when you don't have to..

        // Remove unused effects (string has shortened)
        while (tb._trackingEffects.Count > tb.Text.Length)
        {
            tb.TextEffects.Remove(tb._trackingEffects[tb._trackingEffects.Count - 1]);
            tb._trackingEffects.RemoveAt(tb._trackingEffects.Count - 1);
        }

        tb._lastTrackingTextLength = tb.Text.Length;

        // Add missing effects (string has grown)
        for (int i = tb._trackingEffects.Count; i < tb.Text.Length; i++)
        {
            var fx = new TextEffect()
            {
                PositionCount = i,
                Transform = tb._tracking
            };
            tb._trackingEffects.Add(fx);
            tb.TextEffects.Add(fx);
        }

        // Ugly hack to fix overall alignment
        tb.RenderTransform = tb._trackingAlignment;

    }

    private readonly TranslateTransform _tracking = new TranslateTransform();
    private readonly TranslateTransform _trackingAlignment = new TranslateTransform();
    private readonly List<TextEffect> _trackingEffects = new List<TextEffect>();
    int _lastTrackingTextLength;

}
公共类高级StretchTextBlock:TextBlock
{
/// 
///定义字符/字母间距
/// 
公共整数跟踪
{
get=>(int)GetValue(TrackingProperty);
set=>SetValue(TrackingProperty,value);
}
公共静态只读从属属性TrackingProperty=
DependencyProperty.寄存器(“跟踪”、typeof(int)、typeof(AdvancedStretchTextBlock),
新的UIPropertyMetadata(0,
跟踪属性(已更改);
静态void TrackingPropertyChanged(DependencyObject o、DependencyPropertyChangedEventArgs e)
{
if(!(o是AdvancedStretchTextBlock tb)| | String.IsNullOrEmpty(tb.Text))
返回;
tb._tracking.X=(int)e.NewValue;
tb._trackingAlignment.X=-(int)e.NewValue*tb.Text.Length;
if(tb.\u lastTrackingTextLength==tb.Text.Length)
return;//避免在不需要时重新创建效果。。
//删除未使用的效果(字符串已缩短)
while(tb.\u trackingEffects.Count>tb.Text.Length)
{
tb.TextEffects.Remove(tb._trackingEffects[tb._trackingEffects.Count-1]);
tb._trackingEffects.RemoveAt(tb._trackingEffects.Count-1);
}
tb.\u lastTrackingTextLength=tb.Text.Length;
//添加缺少的效果(字符串已增长)
对于(int i=tb.\u trackingEffects.Count;i
对于xaml的使用:

<local:AdvancedStretchTextBlock Text=""... Tracking="-10"/>


ref:

Thx,看起来好像在工作。实际上,我试图创建condentedTextBlock:TextBlock类,但它在画布内部不起作用。但您的“AdvancedStretchTextBlock”在画布中工作良好。是什么让它在画布上工作得很好?如果我想理解你的代码,你建议的任何资源或教程?
<local:AdvancedStretchTextBlock Text=""... Tracking="-10"/>