1

我想我遗漏了一些明显的东西......我正在为 WPF 使用 Telerik Rad 控件,但我认为富文本框对邮件合并功能使用了一些类似的实现。

我想在我的邮件合并字段上有一些友好的名字。(即字段名称中的空格)所以我有一个类例如

Public Class someclass
{
<DisplayName("This is the complex description of the field")>
Public property thisfieldnamehasacomplexdescription as string

Public property anothercomplexfield as string
}

这是我知道在邮件合并下拉列表中获取“友好”名称的唯一方法。所以这两个字段可以正常显示为:“这是该字段的复杂描述”“另一个复杂字段”

但是当您进行合并时,实际上只有另一个复杂字段会填充数据。

我是否必须对包含邮件合并字段的 raddropdownbutton 进行模板化?在某处有这样的例子吗?

也是一个子问题。我如何在这些东西上添加滚动条?

(我也知道这个板不是 TELERIK 特定的板(呃!)但这可能对将来的某人有用。所以我将从 Telerik 得到的答案复制到这里! http://www.telerik.com /community/forums/wpf/richtextbox/558428-radrichtextbox-mailmerge---using-displayname-to-create-a-friendly-name-with-spaces.aspx )

4

1 回答 1

0

这是telerik给我的:

使用默认的 MergeFields,无法更改字段的显示名称片段以获得更友好的外观。如果您通过从 MergeField 类派生来实现自定义 MergeField,这应该是可能的。这是一个示例实现,展示了如何做到这一点:

public class CustomMergeField : MergeField
{
private const string CustomFieldName = "CustomField";

static CustomMergeField()
{
    CodeBasedFieldFactory.RegisterFieldType(CustomMergeField.CustomFieldName, () => { return new CustomMergeField(); });
}

public override string FieldTypeName
{
    get
    {
        return CustomMergeField.CustomFieldName;
    }
}

public override Field CreateInstance()
{
    return new CustomMergeField();
}

protected override DocumentFragment GetDisplayNameFragment()
{
    return base.CreateFragmentFromText(string.Format(Field.DisplayNameFragmentFormat, this.GetFriendlyFieldName(this.PropertyPath)));
}

private string GetFriendlyFieldName(string fieldName)
{
    int lettersInEnglishAlphabet = 26;
    List<char> separators = new List<char>(lettersInEnglishAlphabet);
    for (int i = 0; i < lettersInEnglishAlphabet; i++)
    {
        separators.Add((char)('A' + i));
    }
    StringBuilder newFieldName = new StringBuilder();
    int previousIndex = 0;
    for (int i = 1; i < fieldName.Length; i++)
    {
        if (separators.Contains(fieldName[i]))
        {
            if (previousIndex > 0)
            {
                newFieldName.Append(" ");
            }
            newFieldName.Append(fieldName.Substring(previousIndex, i - previousIndex));
            previousIndex = i;
        }
    }
    newFieldName.Append(" " + fieldName.Substring(previousIndex));
    return newFieldName.ToString();
}
}

请注意,当 DisplayMode 为 Code 时显示的片段无法更改。

至于您的其他问题,您可以更改下拉按钮的内容以显示字段的友好名称并以下列方式包含滚动条: 1. 首先,从 XAML 中删除按钮与 InsertMergeFieldEmptyCommand 的绑定并给出它是一个名称(例如 insertMergeField)。2. 接下来,在代码隐藏中添加以下代码:

AddMergeFieldsInDropDownContent(this.insertMergeFieldButton);

private void AddMergeFieldsInDropDownContent(RadRibbonDropDownButton radRibbonDropDownButton)

{ 网格网格 = 新网格();grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(100, GridUnitType.Pixel) });

ScrollViewer scrollViewer = new ScrollViewer();
scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
StackPanel stackPanel = new StackPanel();

foreach (string fieldName in this.editor.Document.MailMergeDataSource.GetColumnNames())
{
    RadRibbonButton fieldButton = new RadRibbonButton()
    {
        Text = this.GetFriendlyFieldName(fieldName),
        Size = ButtonSize.Medium,
        HorizontalAlignment = HorizontalAlignment.Stretch,
        HorizontalContentAlignment = HorizontalAlignment.Left
    };

    fieldButton.Command = this.editor.Commands.InsertFieldCommand;
    fieldButton.CommandParameter = new MergeField() { PropertyPath = fieldName };
    //or
    //fieldButton.CommandParameter = new CustomMergeField() { PropertyPath = fieldName };

    stackPanel.Children.Add(fieldButton);
}
stackPanel.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
scrollViewer.Content = stackPanel;
grid.Children.Add(scrollViewer);

radRibbonDropDownButton.DropDownContent = grid;
}

当然,您可以优化 GetFriendlyName 方法的代码并以两种类都可用的方式添加它。

于 2012-11-23T02:49:57.673 回答