private TokenItem CreateTokenItem(Token token) { object item = token.Item; var tokenItem = new TokenItem() { TokenKey = token.TokenKey, Content = item, ContentTemplate = TokenTemplate }; if (TokenTemplate == null) { //if no template was supplied let's try to get a value from the object using the DisplayMemberPath if (!String.IsNullOrEmpty(DisplayMemberPath)) { var property = item.GetType().GetProperty(DisplayMemberPath); if (property != null) { var value = property.GetValue(item, null); if (value != null) tokenItem.Content = value; } } } return tokenItem; }
private InlineUIContainer CreateTokenContainer(Token token) { return new InlineUIContainer(CreateTokenItem(token)) { BaselineAlignment = BaselineAlignment.Center }; }
private Token ResolveTokenBySearchMemberPath(string searchText) { //create a new token and default the settings to the search text var token = new Token(TokenDelimiter) { TokenKey = searchText, Item = searchText }; if (ItemsSource != null) { foreach (object item in ItemsSource) { var searchProperty = item.GetType().GetProperty(SearchMemberPath); if (searchProperty != null) { var searchValue = searchProperty.GetValue(item, null); if (searchText.Equals(searchValue.ToString(), StringComparison.InvariantCultureIgnoreCase)) { var valueProperty = item.GetType().GetProperty(ValueMemberPath); if (valueProperty != null) token.TokenKey = valueProperty.GetValue(item, null).ToString(); token.Item = item; break; } } } } return token; }
private void ReplaceTextWithToken(string inputText, Token token) { _surpressTextChangedEvent = true; var para = _rtb.CaretPosition.Paragraph; var matchedRun = para.Inlines.FirstOrDefault(inline => { var run = inline as Run; return (run != null && run.Text.EndsWith(inputText)); }) as Run; if (matchedRun != null) // Found a Run that matched the inputText { var tokenContainer = CreateTokenContainer(token); para.Inlines.InsertBefore(matchedRun, tokenContainer); // Remove only if the Text in the Run is the same as inputText, else split up if (matchedRun.Text == inputText) { para.Inlines.Remove(matchedRun); } else // Split up { var index = matchedRun.Text.IndexOf(inputText) + inputText.Length; var tailEnd = new Run(matchedRun.Text.Substring(index)); para.Inlines.InsertAfter(matchedRun, tailEnd); para.Inlines.Remove(matchedRun); } //now append the Text with the token key SetTextInternal(Text + token.TokenKey); } _surpressTextChangedEvent = false; }
private void InitializeTokensFromText() { if (!String.IsNullOrEmpty(Text)) { string[] tokenKeys = Text.Split(new string[] { TokenDelimiter }, StringSplitOptions.RemoveEmptyEntries); foreach (string tokenKey in tokenKeys) { var para = _rtb.CaretPosition.Paragraph; var token = new Token(TokenDelimiter) { TokenKey = tokenKey, Item = ResolveItemByTokenKey(tokenKey) }; para.Inlines.Add(CreateTokenContainer(token)); } } }