One of my requirement in Silverlight I need
to create user control with a rich textbox and a button. The requirement is when
click the button a popup should open with the content of text. We need to maintain the styles of text box in the popup also. That is the reason I have used Rich text control .
Xaml Code
<StackPanel
Orientation="Horizontal" Grid.Row="0"
HorizontalAlignment="Left"> <telerik:RadRichTextBox x:Name="_richTextBox" MaxWidth="280"
DocumentInheritsDefaultStyleSettings="True"
DocumentContentChanged="_richTextBox_DocumentContentChanged"> <telerik:RadRichTextBox.Resources>
<documentsHtml:HtmlDataProvider x:Key="HtmlDataProvider" RichTextBox="{Binding ElementName=_richTextBox}" /> </telerik:RadRichTextBox.Resources> </telerik:RadRichTextBox>
<Button Name="EllipsisCopyArt" Click="EllipsisCopyArt_Click" Tag="{Binding ElementName=_richTextBox}"
Content="..." Width="17" /> </StackPanel>
The above code I have used Telerik controls,
we can use normal richtextbox or text box. For getting data from UI I have added
a Dependency Property to the control and add one Property for reading the
Value.
public static readonly DependencyProperty RichTextProperty =DependencyProperty.Register("RichText", typeof(object), typeof(CustomRadRichTextBox), new PropertyMetadata(""));
public object RichText
{get
{
return (object)GetValue(RichTextProperty);
}
set
{
SetValue(RichTextProperty, value);
}
}
When you click on the button the event is handled in the event handler .Inside we can create a new custom dialog class
private void EllipsisCopyArt_Click(object
sender, RoutedEventArgs e)
{if (RichText == null || RichText.ToString().Trim().Length == 0) return;
Dialog dlg = new MyDialog();
dlg.Controltext = RichText;
dlg.Show(DialogStyle.ModalDimmed);
}
Implementation of Dialog class
public abstract class Dialog
{private bool _isShowing;
private Popup _popup;
private Grid _grid;
private Canvas _canvas;
private FrameworkElement _content;
public void Show(DialogStyle style)
{
if (_isShowing)
throw new InvalidOperationException();
_isShowing = true;
EnsurePopup(style);
_popup.IsOpen = true;
Application.Current.Host.Content.Resized += OnPluginSizeChanged;
}
public object Controltext = string.Empty;
public void Close()
{
_isShowing = false;
if (_popup != null)
{
_popup.IsOpen = false;
Application.Current.Host.Content.Resized -= OnPluginSizeChanged;
}
}
// Override this method to add your content to the dialog
protected abstract FrameworkElement GetContent();
private void EnsurePopup(DialogStyle style)
{
if (_popup != null)
return;
_popup = new Popup();
_grid = new Grid();
_popup.Child = _grid;
if (style != DialogStyle.NonModal)
{
_canvas = new Canvas();
if (style == DialogStyle.Modal)
{
_canvas.Background = new SolidColorBrush(Colors.Transparent);
}
else if (style == DialogStyle.ModalDimmed)
{
_canvas.Background = new SolidColorBrush(Color.FromArgb(180, 180, 180, 180));
}
_grid.Children.Add(_canvas);
}
_grid.Children.Add(_content = GetContent());
UpdateSize();
}
private void OnPluginSizeChanged(object sender, EventArgs e)
{
UpdateSize();
}
private void UpdateSize()
{
_grid.Width = Application.Current.Host.Content.ActualWidth;
_grid.Height = Application.Current.Host.Content.ActualHeight;
if (_canvas != null)
{
int width = int.Parse(HtmlPage.Window.Eval("screen.width").ToString());
int height = int.Parse(HtmlPage.Window.Eval("screen.height").ToString());
_canvas.Width = width;
_canvas.Height = height;
}
}
}
//Create enumeration
for different styles.
public enum
DialogStyle{
NonModal,
Modal,
ModalDimmed
};
Finally we need to derive the Dialog class in to SubDialog class and implement the content or the Popup.We can able to load Template for this .
public class MyDialog : Dialog
{
protected override FrameworkElement GetContent()
{
// You could just use Template for loading controls.
Grid grid = new Grid() { Width = 360, MaxHeight = 415 };
Border border = new Border() { BorderBrush = new SolidColorBrush(Colors.DarkGray), BorderThickness = new Thickness(5), Margin = new Thickness(0), Background = new SolidColorBrush(Colors.White) };
Telerik.Windows.Documents.Model.Paragraph prgParagraph = new Telerik.Windows.Documents.Model.Paragraph();
// create
some text, and add it to the paragraph
Telerik.Windows.Documents.Model.Span rnMyText = new
Telerik.Windows.Documents.Model.Span(Convert.ToString(Controltext));
prgParagraph.Inlines.Add(rnMyText);
//Create
new document Telerik.Windows.Documents.Model.RadDocument rd = new Telerik.Windows.Documents.Model.RadDocument();
//Add new sections to Documents
Telerik.Windows.Documents.Model.Section sec = new Telerik.Windows.Documents.Model.Section();
sec.Blocks.Add(prgParagraph);
rd.Sections.Add(sec);
//Initialize Richtext box
Telerik.Windows.Controls.RadRichTextBox _radRichTxtbox = new RadRichTextBox();
_radRichTxtbox.Document = rd;
_radRichTxtbox.KeyDown += new KeyEventHandler(_radRichTxtbox_KeyDown);
_radRichTxtbox.MaxHeight = 400;
_radRichTxtbox.MaxWidth = 310;
_radRichTxtbox.VerticalScrollBarVisibility =
System.Windows.Controls.ScrollBarVisibility.Auto;
_radRichTxtbox.IsSpellCheckingEnabled = false;
_radRichTxtbox.BorderThickness = new System.Windows.Thickness(0);
_radRichTxtbox.IsReadOnly = true;
_radRichTxtbox.IsSelectionMiniToolBarEnabled = false;
Telerik.Windows.Documents.FormatProviders.Html.HtmlDataProvider _htmlDataProvider =
new
Telerik.Windows.Documents.FormatProviders.Html.HtmlDataProvider();
_htmlDataProvider.RichTextBox =
_radRichTxtbox;
_htmlDataProvider.Html =
Controltext.ToString();_radRichTxtbox.Resources.Add("HtmlDataProvider", _htmlDataProvider);
_radRichTxtbox.UpdateLayout();
_radRichTxtbox.Margin = new System.Windows.Thickness(0, 0, 2, 0);
Grid grid1 = new Grid();
grid1.Margin = new System.Windows.Thickness(1);
LinearGradientBrush brush = new LinearGradientBrush();
brush.StartPoint = new Point(0, 0);
brush.EndPoint = new Point(1, 3);
brush.GradientStops.Add(new GradientStop { Color = ((Color)(Colors.Gray)), Offset = 0.4 });
grid1.Background = brush;
grid1.Children.Add(_radRichTxtbox);
Button button = new Button() { Width = 20, Background = new SolidColorBrush Colors.Gray), Height = 24, Content = "X",
BorderBrush = new SolidColorBrush(Colors.Black),
BorderThickness = new Thickness(1),
HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(2) };
grid1.Children.Add(button);
grid.Children.Add(border);
grid.Children.Add(grid1);
button.Click += (sender, args) => { Close(); };
return grid;
}
//Used for handelling Close button event
void _radRichTxtbox_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
}
}
The popup will display with close button . It will help to close the popup.
_canvas.Background = new SolidColorBrush(Color.FromArgb(180, 180, 180, 180));
The above code will used for making glass effect for the back ground of popup.
No comments:
Post a Comment