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
}

これは、差し込み印刷であるドロップダウンで「フレンドリー」な名前を取得する唯一の方法です。したがって、2 つのフィールドは「これはフィールドの複雑な説明です」「anothercomplexfield」のように正常に表示されます。

ただし、マージを実行すると、実際にデータが入力されるのは別のcomplexfieldだけです。

差し込み印刷フィールドを保持する 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

これはテレリックが私にくれたものです:

デフォルトの 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 のときに表示されるフラグメントは変更できないことに注意してください。

他の質問については、ドロップダウン ボタンの内容を変更して、フィールドのフレンドリ名を表示し、次の方法でスクロールバーを含めることができます。名前です (insertMergeField など)。2. 次に、コード ビハインドに次のコードを追加します。

AddMergeFieldsInDropDownContent(this.insertMergeFieldButton);

private void AddMergeFieldsInDropDownContent(RadRibbonDropDownButton radRibbonDropDownButton)

{ グリッド grid = new Grid(); 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 に答える