or
<DataTemplate DataType="{x:Type local:SplitButtonVisualCommand}"> <telerik:RadSplitButton Command="{Binding Command}" CommandParameter="{Binding GetParameters}" Opacity="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource DisabledWorkAround}}" IsToggle="{Binding RelativeSource={RelativeSource Self}, Path = IsOpen}" DropDownContent="{Binding Childs}" DropDownContentTemplateSelector="{StaticResource VisualTempSelector}"> <telerik:RadSplitButton.Content> <StackPanel Orientation="Horizontal"> <Image Source="{Binding Image}" Margin="0 0 2 0"/> <TextBlock Text="{Binding Caption}" /> </StackPanel> </telerik:RadSplitButton.Content> </telerik:RadSplitButton> </DataTemplate><DataTemplate DataType="{x:Type VisualCommands:VisualCommandCollection}"> <telNav:RadContextMenu ClickToOpen="False" ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource VisualTemplateSelector}"/> </DataTemplate><DataTemplate DataType="{x:Type local:ContextMenuVisualCommand}"> <telNav:RadMenuItem Header="{Binding Caption}" Icon="{Binding Image}" ItemsSource="{Binding Childs}" ItemTemplateSelector="{StaticResource VisualTemplateSelector}" Command="{Binding Command}" CommandParameter="{Binding GetParameters}" Opacity="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource DisabledWorkAround}}"> </telNav:RadMenuItem> </DataTemplate>ItemTemplateSelector.SelectTemplate
gets called Twice for each sub item in the SplitButton DropDownContent, this might explain the extra box inside the MenuItem.protected string myproperty;[Category("MyCategory")]public string MyProperty{ get; set; }RadPropertyGrid1.Item = n;internal sealed class DynamicCategoricalSeriesBehavior : ChartBehavior{ private class SeriesInfo { public string SeriesKey { get; private set; } public int Index { get; set; } public SeriesInfo(string seriesKey, int seriesIndex) { Index = seriesIndex; SeriesKey = seriesKey; } } private Dictionary<CategoricalSeries, SeriesInfo> _categoricalSeries; protected override void OnAttached() { base.OnAttached(); Chart.DataContextChanged += chartDataContextChanged; listenToDataContextPropertyChanged(Chart.DataContext as INotifyPropertyChanged); } protected override void OnChartTemplateChanged(Canvas oldAdornerContainer, Canvas adornerContainer) { base.OnChartTemplateChanged(oldAdornerContainer, adornerContainer); saveCategoricalSeriesValuePropertyNames(); transformMetricsForSeries(Chart as RadCartesianChart); } private void saveCategoricalSeriesValuePropertyNames() { var cartesianChart = Chart as RadCartesianChart; if (cartesianChart == null) return; _categoricalSeries = new Dictionary<CategoricalSeries, SeriesInfo>(); var seriesIndex = 0; foreach (var series in cartesianChart.Series) { var catSeries = series as CategoricalSeries; if (catSeries == null) continue; var propertyNameValueBinding = catSeries.ValueBinding as PropertyNameDataPointBinding; if (propertyNameValueBinding == null) continue; _categoricalSeries[catSeries] = new SeriesInfo(propertyNameValueBinding.PropertyName, seriesIndex++); } } private void chartDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { listenToDataContextPropertyChanged(Chart.DataContext as INotifyPropertyChanged); } private void listenToDataContextPropertyChanged(INotifyPropertyChanged vm) { if (vm == null) return; vm.PropertyChanged += (o, args) => { if (args.PropertyName == "DynamicDataSeries") transformMetricsForSeries(Chart as RadCartesianChart); }; } private void transformMetricsForSeries(RadCartesianChart chart) { if (chart == null) return; var dynamicVM = Chart.DataContext as IDynamicMetricsValueSeriesProvider<double>; if (dynamicVM == null) return; var supportedSeries = dynamicVM.DynamicDataSeries.Select(series => series.SeriesKey).ToList(); foreach (var kvp in _categoricalSeries) { var series = kvp.Key; var seriesKey = kvp.Value.SeriesKey; if (!supportedSeries.Contains(seriesKey)) { removeSeries(chart, series, seriesKey); continue; } insertSeries(chart, series, seriesKey, dynamicVM); } } private void insertSeries(RadCartesianChart chart, CategoricalSeries series, string key, IDynamicMetricsValueSeriesProvider<double> seriesProvider) { if (series.Visibility != Visibility.Visible) { series.Visibility = Visibility.Visible; var index = _categoricalSeries[series].Index; chart.Series.Insert(index, series); } var dataPoints = seriesProvider.MetricsData.Where(i => i.MetricsId == key).ToList(); series.ValueBinding = new PropertyNameDataPointBinding("Value"); series.ItemsSource = dataPoints; var stroked = series as CategoricalStrokedSeries; if (stroked != null) stroked.Stroke = seriesProvider.GetMetricsDataColorBrush(key); } private void removeSeries(RadCartesianChart chart, CategoricalSeries series, string key) { chart.Series.Remove(series); series.Visibility = Visibility.Collapsed; }}
<Window x:Class="TelerikExample.MainWindow"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate x:Key="dtFirstName">
<TextBox Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" />
</DataTemplate>
<DataTemplate x:Key="dtSecondName">
<TextBox Text="{Binding Path=SecondName, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" />
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<telerik:RadGridView Grid.Row="1"
CanUserDeleteRows="False"
CanUserInsertRows="False"
CanUserSortColumns="False"
ShowGroupPanel="False"
AutoGeneratingColumn="RadGridView_AutoGeneratingColumn"
ItemsSource="{Binding Rows}"
RowIndicatorVisibility="Collapsed"
AlternateRowBackground="White"
AlternationCount="2"
Background="AliceBlue"
EditTriggers="None"
HorizontalGridLinesBrush="SlateGray"
SelectionMode="Single"
SelectionUnit="FullRow"
ShowColumnHeaders="True"
IsFilteringAllowed="False"
VerticalGridLinesBrush="Transparent">
</telerik:RadGridView>
</Grid>
</Window>
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace TelerikExample{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { private GridViewModel _viewModel; public MainWindow() { InitializeComponent(); _viewModel = new GridViewModel(); this.DataContext = _viewModel; } private void RadGridView_AutoGeneratingColumn(object sender, Telerik.Windows.Controls.GridViewAutoGeneratingColumnEventArgs e) { if (e.Column.UniqueName == "FirstName") { e.Column.CellTemplate = (DataTemplate)this.Resources["dtFirstName"]; e.Column.Header = "Forename"; } else if (e.Column.UniqueName == "SecondName") { e.Column.CellTemplate = (DataTemplate)this.Resources["dtSecondName"]; e.Column.Header = "Surname"; } else if (e.Column.UniqueName == "ViewModel") { e.Column.IsVisible = false; } } }}namespace TelerikExample{ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Dynamic; using System.Collections.ObjectModel; public class GridViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private ObservableCollection<dynamic> _rows; /// <summary> /// /// </summary> /// <param name="name"></param> protected void OnPropertyChanged(string name) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(name)); } } public GridViewModel() { _rows = new ObservableCollection<dynamic>(); var row = new ExpandoObject() as IDictionary<string, Object>; row.Add("FirstName", string.Empty); row.Add("SecondName", string.Empty); row.Add("ViewModel", this); ((INotifyPropertyChanged)row).PropertyChanged += new PropertyChangedEventHandler(TelerikExample.PropertyChanged.Row_PropertyChanged); _rows.Add(row); } public void CheckForNewRow() { IDictionary<string, Object> lastRow = _rows.Last() as IDictionary<string, Object>; if (((string)lastRow["FirstName"]) != string.Empty || ((string)lastRow["SecondName"]) != string.Empty) { //Add new row var row = new ExpandoObject() as IDictionary<string, Object>; row.Add("FirstName", string.Empty); row.Add("SecondName", string.Empty); row.Add("ViewModel", this); ((INotifyPropertyChanged)row).PropertyChanged += new PropertyChangedEventHandler(TelerikExample.PropertyChanged.Row_PropertyChanged); this.Rows.Add(row); } } public ObservableCollection<dynamic> Rows { get { return _rows; } set { if (_rows != value) { _rows = value; OnPropertyChanged("Rows"); } } } }}namespace TelerikExample{ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Dynamic; public class PropertyChanged { public static void Row_PropertyChanged(object sender, PropertyChangedEventArgs e) { object value; ((IDictionary<string, Object>)sender).TryGetValue("ViewModel", out value); GridViewModel vm = (GridViewModel)value; vm.CheckForNewRow(); } }}I have the below code attached to a SelectionChanged event in a WPF RichTextBox. The idea is for it to select the sentence the user is currently editing, a la iAWriter. Any ideas why it only selects past the cursor, or occasionally throws a ArgumentNullException? Thanks in advance.
Regex sentence = new Regex(@"(([.?!][^\s])*[^.?!])*[.?!]\s");
Regex srtl = new Regex(@"(?:[.?!]\s)(([.?!][^\s])*[^.?!])*", RegexOptions.RightToLeft);
TextRange all = new TextRange(GetPoint(inp.Document.ContentStart, 0), GetPoint(inp.Document.ContentEnd, 0));
TextRange aa = new TextRange(GetPoint(inp.Document.ContentStart, 0), GetPoint(inp.CaretPosition, 0));
TextRange ab = new TextRange(GetPoint(inp.CaretPosition, 0), GetPoint(inp.Document.ContentEnd, 0));
Match b = srtl.Match(aa.Text);
Match c = sentence.Match(ab.Text);
TextRange cur = new TextRange(GetPoint(inp.CaretPosition, -b.Index), GetPoint(inp.CaretPosition.GetPositionAtOffset(c.Index + c.Length + b.Length), 0));
all.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Silver);
cur.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.White);