I'm trying to build my own Autocomplete (intellisense) RadRichTextBox. For the autocomplete popup I'm using your RadListView.
<
Grid
>
<
Grid.ColumnDefinitions
>
<
ColumnDefinition
/>
<
ColumnDefinition
/>
</
Grid.ColumnDefinitions
>
<!-- RichTextBox -->
<
telerik:RadRichTextBox
x:Name
=
"radRichTextBox"
AcceptsReturn
=
"True"
Width
=
"800"
Margin
=
"10"
Grid.Column
=
"0"
DocumentContentChanged
=
"radRichTextBox_DocumentContentChanged"
>
<
telerik:RadRichTextBox.Effect
>
<
DropShadowEffect
ShadowDepth
=
"10"
Color
=
"Gray"
Opacity
=
".4"
Direction
=
"320"
RenderingBias
=
"Performance"
/>
</
telerik:RadRichTextBox.Effect
>
<
telerik:RadRichTextBox.LayoutTransform
>
<
ScaleTransform
ScaleX
=
"{Binding ElementName=Scale, Path=Value}"
ScaleY
=
"{Binding ElementName=Scale, Path=Value}"
/>
</
telerik:RadRichTextBox.LayoutTransform
>
<
telerik:RadDocument
x:Name
=
"radDocument"
/>
</
telerik:RadRichTextBox
>
<!-- AutoCompltete ListBox-->
<
telerik:RadListBox
Width
=
"100"
Height
=
"100"
>
<
ListBoxItem
Content
=
"Item 1"
/>
<
ListBoxItem
Content
=
"Item 2"
/>
<
ListBoxItem
Content
=
"Item 3"
/>
<
ListBoxItem
Content
=
"Item 4"
/>
</
telerik:RadListBox
>
</
Grid
>
Do you know how I can get the caret position and set the RadListBox position next to it / slightly offset?
Thank you very much for your time,
Rob
10 Answers, 1 is accepted
Here's my code:
private
void
radRichTextBox_DocumentContentChanged(
object
sender, EventArgs e)
{
DocumentPosition position =
this
.radRichTextBox.Document.CaretPosition;
double
myMarginX = Math.Round(position.Location.X, 0) + 20;
double
myMarginY = Math.Round(position.Location.Y, 0) + 40;
radListBox.Margin =
new
Thickness(myMarginX, myMarginY, 0, 0);
radListBox.Visibility = Visibility.Visible;
}
If anyone has a better solution then I'm all ears! :).
Thank you very much.
<
telerik:RadRichTextBox.LayoutTransform
>
<
ScaleTransform
ScaleX
=
"{Binding ElementName=radSliderZoom, Path=Value}"
ScaleY
=
"{Binding ElementName=radSliderZoom, Path=Value}"
/>
</
telerik:RadRichTextBox.LayoutTransform
>
I need to find a way to compensate for the RadSlider zoom value.
We are glad that you have found a solution. However, we recommend you that you use the GetViewPointFromDocumentPosition method of the ActiveEditorPresenter of the RadRichTextBox to get the proper coordinates:
this
.RichTextBox.ActiveEditorPresenter.GetViewPointFromDocumentPosition(
this
.RichTextBox.Document.CaretPosition);
You can also use the presenter's offset properties to make your custom calculations. If you encounter any difficulties, contact us again. All the best,
Martin
the Telerik team
Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>
Is this correct? It seems to work :).
Point position =
this
.radRichTextBox.ActiveEditorPresenter.GetViewPointFromDocumentPosition(
this
.radRichTextBox.Document.CaretPosition);
position.Offset(16, 35);
radListBox.Margin =
new
Thickness(position.X, position.Y, 0, 0);
//Make listbox visible
radListBox.Visibility = Visibility.Visible;
There is only little problem with it. When I zoom in on the document then the position of the Intellisense ListBox isn't where it should be until I zoom back out again.
Any idea how I can compensate for the zooming? You can see from one of my examples above that I alter the richtextbox scale transform.
The problem about zooming in your case is that the Scale transform you use is not taken into consideration by the rich text box. To have a proper position from GetViewPointFromDocumentPosition method, you should use the ScaleFactor of the rich text box instead of using a LayoutTransformation. For instance, you can set the ScaleFactor in the following way:
this
.radRichTextBox.ScaleFactor =
new
Size(0.5, 0.5);
You can also use RadRichTextBoxStatusBar which uses the scale factor to zoom in and out:
<
telerik:RadRichTextBoxStatusBar
AssociatedRichTextBox
=
"{Binding ElementName=radRichTextBox}"
></
telerik:RadRichTextBoxStatusBar
>
Working with the scale factor will give you proper view point to place your list box.
Don't hesitate to contact us if you have other questions.
Kind regards,
Martin
the Telerik team
Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>
Thanks for getting back to me. What namespace should I add to my XAML so that the RadRichTextBoxStatusBar shows up?
Currently if I try to use what you have provided to me it doesn't work.
Current References:
T.Windows.Controls
T.Windows.Controls.Docking
T.Windows.Controls.GridView
T.Windows.Controls.Input
T.windows.Controls.Navigation
T.Windows.Controls.RibbonView
T.Windows.Data
T.Windows.Documents
T.Windows.Documents.FormatProviders.Xaml
I have the following telerik namespaces:
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:telerikXaml="clr-namespace:Telerik.Windows.Documents.FormatProviders.Xaml;assembly=Telerik.Windows.Documents.FormatProviders.Xaml"
xmlns:telerikDocking="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.Docking"
Thanks,
Rob
You need a reference to Telerik.Windows.Controls.RichTextBoxUI as well.
Get back to us, if you encounter any other issues.
Martin
the Telerik team
Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>
Thanks for getting back to me. I have managed to add the StatusBar to my project, however I think that the binding doesn't seem to work as the zoom slider bar doesn't zoom the RichTextBox. I'm not quite sure what I'm doing wrong.
Is the "ScrollViewer" causing an issue do you think? see my complete Markup below (sorry it's quick long, I thought that you had better see the complete markup).
<
Grid
Tag
=
"Content"
Background
=
"LightGray"
x:Name
=
"RootLayout"
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"*"
></
RowDefinition
>
<
RowDefinition
Height
=
"Auto"
></
RowDefinition
>
</
Grid.RowDefinitions
>
<!-- Scroll Viewer -->
<
ScrollViewer
HorizontalScrollBarVisibility
=
"Auto"
VerticalScrollBarVisibility
=
"Auto"
>
<
Grid
>
<
Grid.ColumnDefinitions
>
<
ColumnDefinition
/>
<
ColumnDefinition
/>
</
Grid.ColumnDefinitions
>
<!-- RichTextBox -->
<
telerik:RadRichTextBox
x:Name
=
"radRichTextBox"
AcceptsReturn
=
"True"
Width
=
"800"
Margin
=
"10"
Padding
=
"10"
Grid.Column
=
"0"
FontSize
=
"14"
IsSpellCheckingEnabled
=
"False"
DocumentInheritsDefaultStyleSettings
=
"True"
PreviewKeyDown
=
"radRichTextBox_PreviewKeyDown"
DocumentContentChanged
=
"radRichTextBox_DocumentContentChanged"
KeyUp
=
"radRichTextBox_KeyUp"
Loaded
=
"radRichTextBox_Loaded"
PreviewMouseDown
=
"radRichTextBox_PreviewMouseDown"
>
<
telerik:RadRichTextBox.Effect
>
<
DropShadowEffect
ShadowDepth
=
"10"
Color
=
"Gray"
Opacity
=
".4"
Direction
=
"320"
RenderingBias
=
"Performance"
/>
</
telerik:RadRichTextBox.Effect
>
</
telerik:RadRichTextBox
>
<!-- AutoCompltete ListBox-->
<
telerik:RadListBox
MinWidth
=
"100"
MaxHeight
=
"250"
x:Name
=
"radListBox"
Grid.ColumnSpan
=
"2"
Visibility
=
"Collapsed"
HorizontalAlignment
=
"Left"
VerticalAlignment
=
"Top"
CanAutocompleteSelectItems
=
"True"
IsTextSearchEnabled
=
"True"
TextSearchMode
=
"Contains"
TextPath
=
"Name"
ItemTemplate
=
"{StaticResource AutoCompleteListBoxTemplate}"
ItemsSource
=
"{Binding autoCompleteListItems}"
MouseDoubleClick
=
"radListBox_MouseDoubleClick"
MouseUp
=
"radListBox_MouseUp"
>
<
telerik:RadListBox.Effect
>
<
DropShadowEffect
ShadowDepth
=
"10"
Color
=
"Gray"
Opacity
=
".4"
Direction
=
"320"
RenderingBias
=
"Performance"
/>
</
telerik:RadListBox.Effect
>
</
telerik:RadListBox
>
<!-- XAML View -->
<
telerikXaml:XamlDataProvider
Name
=
"xamlDP"
RichTextBox
=
"{Binding ElementName=radRichTextBox}"
Grid.Column
=
"1"
/>
<
TextBox
Name
=
"textBox"
Margin
=
"10"
TextWrapping
=
"Wrap"
AcceptsReturn
=
"True"
IsReadOnly
=
"True"
Text
=
"{Binding ElementName=xamlDP, Path=Xaml, Mode=TwoWay}"
Grid.Column
=
"1"
>
<
TextBox.Effect
>
<
DropShadowEffect
ShadowDepth
=
"10"
Color
=
"Gray"
Opacity
=
".4"
Direction
=
"320"
RenderingBias
=
"Performance"
/>
</
TextBox.Effect
>
</
TextBox
>
</
Grid
>
</
ScrollViewer
>
<!-- Zoom Slider -->
<!--<telerik:RadSlider x:Name="radSliderZoom" Minimum="1" Maximum="20" Width="400" Grid.Row="1" />-->
<
telerik:RadRichTextBoxStatusBar
x:Name
=
"radRichTextBoxStatusBar"
Grid.Row
=
"1"
AssociatedRichTextBox
=
"{Binding ElementName=radRichTextBox}"
/>
</
Grid
>
Thank you very much for your time.
Rob
Sorry I have just realised the document is kind of zooming. The text in the RadRichTextBox is getting larger relative to the Slider in the ToolBar. However, I need the document width/height to expand as well as the text.
I've attached some images showing what is happening. Notice that the text is getting bigger but not the document.
Thanks,
Rob
I will get back to this thread if there are any more issues. Thanks again for your help.
rob