14 changed files with 1 additions and 761 deletions
|
Before Width: | Height: | Size: 312 B |
@ -1,54 +0,0 @@ |
|||
/************************************************************************ |
|||
|
|||
Extended WPF Toolkit |
|||
|
|||
Copyright (C) 2010-2012 Xceed Software Inc. |
|||
|
|||
This program is provided to you under the terms of the Microsoft Reciprocal |
|||
License (Ms-RL) as published at http://wpftoolkit.codeplex.com/license
|
|||
|
|||
This program can be provided to you by Xceed Software Inc. under a |
|||
proprietary commercial license agreement for use in non-Open Source |
|||
projects. The commercial version of Extended WPF Toolkit also includes |
|||
priority technical support, commercial updates, and many additional |
|||
useful WPF controls if you license Xceed Business Suite for WPF. |
|||
|
|||
Visit http://xceed.com and follow @datagrid on Twitter.
|
|||
|
|||
**********************************************************************/ |
|||
using System; |
|||
|
|||
namespace Microsoft.Windows.Controls |
|||
{ |
|||
internal class Token |
|||
{ |
|||
public string Delimiter |
|||
{ |
|||
get; |
|||
private set; |
|||
} |
|||
public object Item |
|||
{ |
|||
get; |
|||
set; |
|||
} |
|||
|
|||
private string _tokenKey; |
|||
public string TokenKey |
|||
{ |
|||
get |
|||
{ |
|||
return _tokenKey; |
|||
} |
|||
set |
|||
{ |
|||
_tokenKey = String.Format( "{0}{1}", value, Delimiter ); |
|||
} |
|||
} |
|||
|
|||
public Token( string delimiter ) |
|||
{ |
|||
Delimiter = delimiter; |
|||
} |
|||
} |
|||
} |
|||
@ -1,44 +0,0 @@ |
|||
/************************************************************************ |
|||
|
|||
Extended WPF Toolkit |
|||
|
|||
Copyright (C) 2010-2012 Xceed Software Inc. |
|||
|
|||
This program is provided to you under the terms of the Microsoft Reciprocal |
|||
License (Ms-RL) as published at http://wpftoolkit.codeplex.com/license
|
|||
|
|||
This program can be provided to you by Xceed Software Inc. under a |
|||
proprietary commercial license agreement for use in non-Open Source |
|||
projects. The commercial version of Extended WPF Toolkit also includes |
|||
priority technical support, commercial updates, and many additional |
|||
useful WPF controls if you license Xceed Business Suite for WPF. |
|||
|
|||
Visit http://xceed.com and follow @datagrid on Twitter.
|
|||
|
|||
**********************************************************************/ |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
|
|||
namespace Microsoft.Windows.Controls |
|||
{ |
|||
public class TokenItem : ContentControl |
|||
{ |
|||
static TokenItem() |
|||
{ |
|||
DefaultStyleKeyProperty.OverrideMetadata( typeof( TokenItem ), new FrameworkPropertyMetadata( typeof( TokenItem ) ) ); |
|||
} |
|||
|
|||
public static readonly DependencyProperty TokenKeyProperty = DependencyProperty.Register( "TokenKey", typeof( string ), typeof( TokenItem ), new UIPropertyMetadata( null ) ); |
|||
public string TokenKey |
|||
{ |
|||
get |
|||
{ |
|||
return ( string )GetValue( TokenKeyProperty ); |
|||
} |
|||
set |
|||
{ |
|||
SetValue( TokenKeyProperty, value ); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,392 +0,0 @@ |
|||
/************************************************************************ |
|||
|
|||
Extended WPF Toolkit |
|||
|
|||
Copyright (C) 2010-2012 Xceed Software Inc. |
|||
|
|||
This program is provided to you under the terms of the Microsoft Reciprocal |
|||
License (Ms-RL) as published at http://wpftoolkit.codeplex.com/license
|
|||
|
|||
This program can be provided to you by Xceed Software Inc. under a |
|||
proprietary commercial license agreement for use in non-Open Source |
|||
projects. The commercial version of Extended WPF Toolkit also includes |
|||
priority technical support, commercial updates, and many additional |
|||
useful WPF controls if you license Xceed Business Suite for WPF. |
|||
|
|||
Visit http://xceed.com and follow @datagrid on Twitter.
|
|||
|
|||
**********************************************************************/ |
|||
//Based of the code written by Pavan Podila
|
|||
//http://blog.pixelingene.com/2010/10/tokenizing-control-convert-text-to-tokens/
|
|||
using System; |
|||
using System.Linq; |
|||
using System.Windows; |
|||
using System.Windows.Controls; |
|||
using System.Windows.Documents; |
|||
using System.Windows.Input; |
|||
|
|||
namespace Microsoft.Windows.Controls |
|||
{ |
|||
public class TokenizedTextBox : ItemsControl |
|||
{ |
|||
#region Members
|
|||
|
|||
private System.Windows.Controls.RichTextBox _rtb = null; |
|||
private bool _surpressTextChanged = false; |
|||
private bool _surpressTextChangedEvent = false; |
|||
|
|||
#endregion //Members
|
|||
|
|||
#region Properties
|
|||
|
|||
public static readonly DependencyProperty SearchMemberPathProperty = DependencyProperty.Register( "SearchMemberPath", typeof( string ), typeof( TokenizedTextBox ), new UIPropertyMetadata( String.Empty ) ); |
|||
public string SearchMemberPath |
|||
{ |
|||
get |
|||
{ |
|||
return ( string )GetValue( SearchMemberPathProperty ); |
|||
} |
|||
set |
|||
{ |
|||
SetValue( SearchMemberPathProperty, value ); |
|||
} |
|||
} |
|||
|
|||
public static readonly DependencyProperty TokenDelimiterProperty = DependencyProperty.Register( "TokenDelimiter", typeof( string ), typeof( TokenizedTextBox ), new UIPropertyMetadata( ";" ) ); |
|||
public string TokenDelimiter |
|||
{ |
|||
get |
|||
{ |
|||
return ( string )GetValue( TokenDelimiterProperty ); |
|||
} |
|||
set |
|||
{ |
|||
SetValue( TokenDelimiterProperty, value ); |
|||
} |
|||
} |
|||
|
|||
public static readonly DependencyProperty TokenTemplateProperty = DependencyProperty.Register( "TokenTemplate", typeof( DataTemplate ), typeof( TokenizedTextBox ), new UIPropertyMetadata( null ) ); |
|||
public DataTemplate TokenTemplate |
|||
{ |
|||
get |
|||
{ |
|||
return ( DataTemplate )GetValue( TokenTemplateProperty ); |
|||
} |
|||
set |
|||
{ |
|||
SetValue( TokenTemplateProperty, value ); |
|||
} |
|||
} |
|||
|
|||
#region Text
|
|||
|
|||
public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof( string ), typeof( TokenizedTextBox ), new UIPropertyMetadata( null, OnTextChanged ) ); |
|||
public string Text |
|||
{ |
|||
get |
|||
{ |
|||
return ( string )GetValue( TextProperty ); |
|||
} |
|||
set |
|||
{ |
|||
SetValue( TextProperty, value ); |
|||
} |
|||
} |
|||
|
|||
private static void OnTextChanged( DependencyObject o, DependencyPropertyChangedEventArgs e ) |
|||
{ |
|||
TokenizedTextBox tokenizedTextBox = o as TokenizedTextBox; |
|||
if( tokenizedTextBox != null ) |
|||
tokenizedTextBox.OnTextChanged( ( string )e.OldValue, ( string )e.NewValue ); |
|||
} |
|||
|
|||
protected virtual void OnTextChanged( string oldValue, string newValue ) |
|||
{ |
|||
if( _rtb == null || _surpressTextChanged ) |
|||
return; |
|||
|
|||
//TODO: when text changes update tokens
|
|||
} |
|||
|
|||
#endregion //Text
|
|||
|
|||
public static readonly DependencyProperty ValueMemberPathProperty = DependencyProperty.Register( "ValueMemberPath", typeof( string ), typeof( TokenizedTextBox ), new UIPropertyMetadata( String.Empty ) ); |
|||
public string ValueMemberPath |
|||
{ |
|||
get |
|||
{ |
|||
return ( string )GetValue( ValueMemberPathProperty ); |
|||
} |
|||
set |
|||
{ |
|||
SetValue( ValueMemberPathProperty, value ); |
|||
} |
|||
} |
|||
|
|||
|
|||
#endregion //Properties
|
|||
|
|||
#region Constructors
|
|||
|
|||
static TokenizedTextBox() |
|||
{ |
|||
DefaultStyleKeyProperty.OverrideMetadata( typeof( TokenizedTextBox ), new FrameworkPropertyMetadata( typeof( TokenizedTextBox ) ) ); |
|||
} |
|||
|
|||
public TokenizedTextBox() |
|||
{ |
|||
CommandBindings.Add( new CommandBinding( TokenizedTextBoxCommands.Delete, DeleteToken ) ); |
|||
} |
|||
|
|||
#endregion //Constructors
|
|||
|
|||
#region Base Class Overrides
|
|||
|
|||
public override void OnApplyTemplate() |
|||
{ |
|||
base.OnApplyTemplate(); |
|||
|
|||
if( _rtb != null ) |
|||
{ |
|||
_rtb.TextChanged -= RichTextBox_TextChanged; |
|||
_rtb.PreviewKeyDown -= RichTextBox_PreviewKeyDown; |
|||
} |
|||
_rtb = GetTemplateChild( "PART_ContentHost" ) as System.Windows.Controls.RichTextBox; |
|||
if( _rtb != null ) |
|||
{ |
|||
_rtb.TextChanged += RichTextBox_TextChanged; |
|||
_rtb.PreviewKeyDown += RichTextBox_PreviewKeyDown; |
|||
} |
|||
|
|||
InitializeTokensFromText(); |
|||
} |
|||
|
|||
#endregion //Base Class Overrides
|
|||
|
|||
#region Event Handlers
|
|||
|
|||
private void RichTextBox_TextChanged( object sender, TextChangedEventArgs e ) |
|||
{ |
|||
if( _surpressTextChangedEvent ) |
|||
return; |
|||
|
|||
var text = _rtb.CaretPosition.GetTextInRun( LogicalDirection.Backward ); |
|||
var token = ResolveToken( text ); |
|||
if( token != null ) |
|||
{ |
|||
ReplaceTextWithToken( text.Trim(), token ); |
|||
} |
|||
} |
|||
|
|||
void RichTextBox_PreviewKeyDown( object sender, KeyEventArgs e ) |
|||
{ |
|||
InlineUIContainer container = null; |
|||
|
|||
if( e.Key == Key.Back ) |
|||
{ |
|||
container = _rtb.CaretPosition.GetAdjacentElement( LogicalDirection.Backward ) as InlineUIContainer; |
|||
} |
|||
else if( e.Key == Key.Delete ) |
|||
{ |
|||
//if the selected text is a blank space, I will assume that a token item is selected.
|
|||
//if a token item is selected, we need to move the caret position to the left of the element so we can grab the InlineUIContainer
|
|||
if( _rtb.Selection.Text == " " ) |
|||
{ |
|||
TextPointer moveTo = _rtb.CaretPosition.GetNextInsertionPosition( LogicalDirection.Backward ); |
|||
_rtb.CaretPosition = moveTo; |
|||
} |
|||
|
|||
//the cursor is to the left of a token item
|
|||
container = _rtb.CaretPosition.GetAdjacentElement( LogicalDirection.Forward ) as InlineUIContainer; |
|||
} |
|||
|
|||
//if the container is not null that means we have something to delete
|
|||
if( container != null ) |
|||
{ |
|||
var token = ( container as InlineUIContainer ).Child as TokenItem; |
|||
if( token != null ) |
|||
{ |
|||
SetTextInternal( Text.Replace( token.TokenKey, "" ) ); |
|||
} |
|||
} |
|||
} |
|||
|
|||
#endregion //Event Handlers
|
|||
|
|||
#region Methods
|
|||
|
|||
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 ) ); |
|||
} |
|||
} |
|||
} |
|||
|
|||
private Token ResolveToken( string text ) |
|||
{ |
|||
if( text.EndsWith( TokenDelimiter ) ) |
|||
return ResolveTokenBySearchMemberPath( text.Substring( 0, text.Length - 1 ).Trim() ); |
|||
|
|||
return null; |
|||
} |
|||
|
|||
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 object ResolveItemByTokenKey( string tokenKey ) |
|||
{ |
|||
if( ItemsSource != null ) |
|||
{ |
|||
foreach( object item in ItemsSource ) |
|||
{ |
|||
var property = item.GetType().GetProperty( ValueMemberPath ); |
|||
if( property != null ) |
|||
{ |
|||
var value = property.GetValue( item, null ); |
|||
if( tokenKey.Equals( value.ToString(), StringComparison.InvariantCultureIgnoreCase ) ) |
|||
return item; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return tokenKey; |
|||
} |
|||
|
|||
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 InlineUIContainer CreateTokenContainer( Token token ) |
|||
{ |
|||
return new InlineUIContainer( CreateTokenItem( token ) ) |
|||
{ |
|||
BaselineAlignment = BaselineAlignment.Center |
|||
}; |
|||
} |
|||
|
|||
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 void DeleteToken( object sender, ExecutedRoutedEventArgs e ) |
|||
{ |
|||
var para = _rtb.CaretPosition.Paragraph; |
|||
|
|||
Inline inlineToRemove = para.Inlines.Where( inline => inline is InlineUIContainer && ( ( inline as InlineUIContainer ).Child as TokenItem ).TokenKey.Equals( e.Parameter ) ).FirstOrDefault(); |
|||
|
|||
if( inlineToRemove != null ) |
|||
para.Inlines.Remove( inlineToRemove ); |
|||
|
|||
//update Text to remove delimited value
|
|||
SetTextInternal( Text.Replace( e.Parameter.ToString(), "" ) ); |
|||
} |
|||
|
|||
private void SetTextInternal( string text ) |
|||
{ |
|||
_surpressTextChanged = true; |
|||
Text = text; |
|||
_surpressTextChanged = false; |
|||
} |
|||
|
|||
#endregion //Methods
|
|||
} |
|||
} |
|||
@ -1,35 +0,0 @@ |
|||
/************************************************************************ |
|||
|
|||
Extended WPF Toolkit |
|||
|
|||
Copyright (C) 2010-2012 Xceed Software Inc. |
|||
|
|||
This program is provided to you under the terms of the Microsoft Reciprocal |
|||
License (Ms-RL) as published at http://wpftoolkit.codeplex.com/license
|
|||
|
|||
This program can be provided to you by Xceed Software Inc. under a |
|||
proprietary commercial license agreement for use in non-Open Source |
|||
projects. The commercial version of Extended WPF Toolkit also includes |
|||
priority technical support, commercial updates, and many additional |
|||
useful WPF controls if you license Xceed Business Suite for WPF. |
|||
|
|||
Visit http://xceed.com and follow @datagrid on Twitter.
|
|||
|
|||
**********************************************************************/ |
|||
using System.Windows.Input; |
|||
|
|||
namespace Microsoft.Windows.Controls |
|||
{ |
|||
public static class TokenizedTextBoxCommands |
|||
{ |
|||
private static RoutedCommand _deleteCommand = new RoutedCommand(); |
|||
|
|||
public static RoutedCommand Delete |
|||
{ |
|||
get |
|||
{ |
|||
return _deleteCommand; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,78 +0,0 @@ |
|||
<!--********************************************************************* |
|||
|
|||
Extended WPF Toolkit |
|||
|
|||
Copyright (C) 2010-2012 Xceed Software Inc. |
|||
|
|||
This program is provided to you under the terms of the Microsoft Reciprocal |
|||
License (Ms-RL) as published at http://wpftoolkit.codeplex.com/license |
|||
|
|||
This program can be provided to you by Xceed Software Inc. under a |
|||
proprietary commercial license agreement for use in non-Open Source |
|||
projects. The commercial version of Extended WPF Toolkit also includes |
|||
priority technical support, commercial updates, and many additional |
|||
useful WPF controls if you license Xceed Business Suite for WPF. |
|||
|
|||
Visit http://xceed.com and follow @datagrid on Twitter. |
|||
|
|||
********************************************************************--> |
|||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:local="clr-namespace:Microsoft.Windows.Controls"> |
|||
|
|||
<Style TargetType="{x:Type local:TokenItem}"> |
|||
<Setter Property="Background" Value="#F3F7FD" /> |
|||
<Setter Property="BorderBrush" Value="#BBD8FB" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="Cursor" Value="Arrow" /> |
|||
<Setter Property="Padding" Value="5,1,5,1" /> |
|||
<Setter Property="Margin" Value="1,0" /> |
|||
<Setter Property="Template"> |
|||
<Setter.Value> |
|||
<ControlTemplate TargetType="{x:Type local:TokenItem}"> |
|||
<Border Background="{TemplateBinding Background}" |
|||
BorderBrush="{TemplateBinding BorderBrush}" |
|||
BorderThickness="{TemplateBinding BorderThickness}" |
|||
Padding="{TemplateBinding Padding}" |
|||
Margin="{TemplateBinding Margin}"> |
|||
<StackPanel Orientation="Horizontal" Margin="1"> |
|||
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" /> |
|||
<Button Margin="3,0,0,0" Cursor="Hand" Command="local:TokenizedTextBoxCommands.Delete" CommandParameter="{TemplateBinding TokenKey}"> |
|||
<Button.Template> |
|||
<ControlTemplate TargetType="Button"> |
|||
<ContentPresenter /> |
|||
</ControlTemplate> |
|||
</Button.Template> |
|||
<Image Source="/WPFToolkit.Extended;component/TokenizedTextBox/Images/delete8.png" Width="8" Height="8" /> |
|||
</Button> |
|||
</StackPanel> |
|||
</Border> |
|||
</ControlTemplate> |
|||
</Setter.Value> |
|||
</Setter> |
|||
</Style> |
|||
|
|||
<Style TargetType="{x:Type local:TokenizedTextBox}"> |
|||
<Setter Property="Template"> |
|||
<Setter.Value> |
|||
<ControlTemplate TargetType="{x:Type local:TokenizedTextBox}"> |
|||
<Border x:Name="Bd" |
|||
Background="{TemplateBinding Background}" |
|||
BorderBrush="{TemplateBinding BorderBrush}" |
|||
BorderThickness="{TemplateBinding BorderThickness}"> |
|||
<Grid> |
|||
<RichTextBox x:Name="PART_ContentHost" AcceptsReturn="False" IsDocumentEnabled="True" Padding="-3,0,0,0" /> |
|||
<!--<Popup> |
|||
<Grid Background="White"> |
|||
<ItemsPresenter /> |
|||
</Grid> |
|||
</Popup>--> |
|||
</Grid> |
|||
</Border> |
|||
|
|||
</ControlTemplate> |
|||
</Setter.Value> |
|||
</Setter> |
|||
</Style> |
|||
|
|||
</ResourceDictionary> |
|||
|
Before Width: | Height: | Size: 312 B |
@ -1,78 +0,0 @@ |
|||
<!--********************************************************************* |
|||
|
|||
Extended WPF Toolkit |
|||
|
|||
Copyright (C) 2010-2012 Xceed Software Inc. |
|||
|
|||
This program is provided to you under the terms of the Microsoft Reciprocal |
|||
License (Ms-RL) as published at http://wpftoolkit.codeplex.com/license |
|||
|
|||
This program can be provided to you by Xceed Software Inc. under a |
|||
proprietary commercial license agreement for use in non-Open Source |
|||
projects. The commercial version of Extended WPF Toolkit also includes |
|||
priority technical support, commercial updates, and many additional |
|||
useful WPF controls if you license Xceed Business Suite for WPF. |
|||
|
|||
Visit http://xceed.com and follow @datagrid on Twitter. |
|||
|
|||
********************************************************************--> |
|||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:local="clr-namespace:Microsoft.Windows.Controls"> |
|||
|
|||
<Style TargetType="{x:Type local:TokenItem}"> |
|||
<Setter Property="Background" Value="#F3F7FD" /> |
|||
<Setter Property="BorderBrush" Value="#BBD8FB" /> |
|||
<Setter Property="BorderThickness" Value="1" /> |
|||
<Setter Property="Cursor" Value="Arrow" /> |
|||
<Setter Property="Padding" Value="5,1,5,1" /> |
|||
<Setter Property="Margin" Value="1,0" /> |
|||
<Setter Property="Template"> |
|||
<Setter.Value> |
|||
<ControlTemplate TargetType="{x:Type local:TokenItem}"> |
|||
<Border Background="{TemplateBinding Background}" |
|||
BorderBrush="{TemplateBinding BorderBrush}" |
|||
BorderThickness="{TemplateBinding BorderThickness}" |
|||
Padding="{TemplateBinding Padding}" |
|||
Margin="{TemplateBinding Margin}"> |
|||
<StackPanel Orientation="Horizontal" Margin="1"> |
|||
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" /> |
|||
<Button Margin="3,0,0,0" Cursor="Hand" Command="local:TokenizedTextBoxCommands.Delete" CommandParameter="{TemplateBinding TokenKey}"> |
|||
<Button.Template> |
|||
<ControlTemplate TargetType="Button"> |
|||
<ContentPresenter /> |
|||
</ControlTemplate> |
|||
</Button.Template> |
|||
<Image Source="/WPFToolkit.Extended;component/TokenizedTextBox/Images/delete8.png" Width="8" Height="8" /> |
|||
</Button> |
|||
</StackPanel> |
|||
</Border> |
|||
</ControlTemplate> |
|||
</Setter.Value> |
|||
</Setter> |
|||
</Style> |
|||
|
|||
<Style TargetType="{x:Type local:TokenizedTextBox}"> |
|||
<Setter Property="Template"> |
|||
<Setter.Value> |
|||
<ControlTemplate TargetType="{x:Type local:TokenizedTextBox}"> |
|||
<Border x:Name="Bd" |
|||
Background="{TemplateBinding Background}" |
|||
BorderBrush="{TemplateBinding BorderBrush}" |
|||
BorderThickness="{TemplateBinding BorderThickness}"> |
|||
<Grid> |
|||
<RichTextBox x:Name="PART_ContentHost" AcceptsReturn="False" IsDocumentEnabled="True" Padding="-3,0,0,0" /> |
|||
<!--<Popup> |
|||
<Grid Background="White"> |
|||
<ItemsPresenter /> |
|||
</Grid> |
|||
</Popup>--> |
|||
</Grid> |
|||
</Border> |
|||
|
|||
</ControlTemplate> |
|||
</Setter.Value> |
|||
</Setter> |
|||
</Style> |
|||
|
|||
</ResourceDictionary> |
|||
Loading…
Reference in new issue