2012-06-26 2 views
1

Я думаю, что у меня что-то неявное ... Я использую элементы управления Telerik Rad для WPF, но я предполагаю, что в текстовом поле Rich используется некоторая аналогичная реализация для почты объединить функции.Telerik Mail Merge - Дружественные имена (с помощью RadRichTextBox)

Я хочу иметь дружеские имена на своих полях слияния. (а именно пробела в именах полей) Так у меня есть класс, например

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

Public property anothercomplexfield as string 
} 

Это единственный способ я знаю, чтобы получить «дружественные» имена в раскрывающемся списке, который является слиянием почты. Так два поля повернуть вверх в порядке, как: «Это комплексное описание поля» «anothercomplexfield»

но только anothercomplexfield фактически населяет с данными, когда вы делаете слияние.

Могу ли я создать шаблон раддропровода, который содержит поля слияния? Есть ли пример этого где-нибудь?

Также под вопросом. Как добавить полосу прокрутки на эти вещи?

(также я знаю, эта плата не является Telerik конкретный совет (дух!), Но это может быть полезным для кого-то в будущем. Таким образом, я буду копировать ответ я получаю от Telerik в здесь! http://www.telerik.com/community/forums/wpf/richtextbox/558428-radrichtextbox-mailmerge---using-displayname-to-create-a-friendly-name-with-spaces.aspx)

ответ

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 является код не может быть изменен.

Что касается вашего другого вопроса, вы можете изменить содержимое раскрывающегося списка, чтобы показать дружественное имя полей и включить полосу прокрутки следующим образом: 1. Сначала удалите привязку кнопки к InsertMergeFieldEmptyCommand из XAML и присвоить ему имя (например, insertMergeField). 2. Затем добавьте следующий код в код-за:

AddMergeFieldsInDropDownContent(this.insertMergeFieldButton); 

private void AddMergeFieldsInDropDownContent(RadRibbonDropDownButton radRibbonDropDownButton) 

{ Сетка сетки = новый сетки(); grid.RowDefinitions.Add (новый 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 и добавить его в пути, который будет доступен по обоим классам.

Смежные вопросы