What Are xmlns and xmlns:x in WPF? Understanding XML Namespace Declarations

In WPF (Windows Presentation Foundation), xmlns and xmlns:x are XML namespace declarations used in XAML files. They define the scope of XML namespaces, which are used to distinguish between elements and attributes that might have the same name but are used in different contexts. xmlns : The Default XML Namespace Definition : xmlns stands for XML namespace. It is used to declare the default namespace for the elements in the XAML file. Purpose : In WPF, it typically maps to the .NET namespaces that contain the classes and controls used in WPF applications. This default namespace allows you to use the WPF controls and elements without prefixing them. Example : <Window x:Class="WpfApp.MainWindow"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    ... > <Grid>        <Button Content="Click Me"/>     </Grid> </Window> Here, xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" sets...

How to create Expandable TextBox in Wpf

Step 1: Right click on project 
Step 2: Click on Add and select New Item
Step 3: Search for Custom Control
Step 4: Select Custom Control(WPF)
Step 5: Write ExpandableTextBox in Name and click on Add

It will create one class with the Name ExpandableTextBox with following code:

namespace CustomControl.Controls
{
public class ExpandableTextBox : Control
    {
        static ExpandableTextBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ExpandableTextBox), new FrameworkPropertyMetadata(typeof(ExpandableTextBox)));
        }
    }
}

It will also create a folder called Themes inside this folder it will create ResourceDictionary with the Name Generic with folowing code:

Generic.xaml


<ResourceDictionary
		xmlns:local="clr-namespace:Wpf" 
		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">


    <Style TargetType="{x:Type local:ExpandableTextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:ExpandableTextBox}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                            
                            <!--#region newlly added code -->
                            <Grid x:Name="MainGrid">
                            	<TextBox x:Name="ExpandableTextBox" AcceptsReturn="True"
                                     ScrollViewer.VerticalScrollBarVisibility="Auto"
                            		 ScrollViewer.HorizontalScrollBarVisibility="Auto"/>
                           		<ResizeGrip x:Name="Grip" Cursor="SizeNWSE" HorizontalAlignment="Right" VerticalAlignment="Bottom" Height="14"
                                        Width="14"/>
                        	</Grid>
                            <!--#endregion--> 
                            
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>





Now lets modify the ExpandableTextBox class code

    [TemplatePart(Name = "ExpandableTextBox", Type = typeof(TextBox))]
    [TemplatePart(Name = "Grip", Type = typeof(ResizeGrip))]
    [TemplatePart(Name = "MainGrid", Type = typeof(Grid))]
    public class ExpandableTextBox : Control
    {
        static ExpandableTextBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(ExpandableTextBox), new FrameworkPropertyMetadata(typeof(ExpandableTextBox)));
        }
        TextBox _expandableTextbox;
        ResizeGrip _resizeGrip;
        Grid _mainGrid;
        Point LastPoint;
        private bool _dragInProgress;

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            if (this.Template != null)
            {
                _expandableTextbox = this.Template.FindName("ExpandableTextBox", this) as TextBox;
                _resizeGrip = this.Template.FindName("Grip", this) as ResizeGrip;
                _mainGrid = this.Template.FindName("MainGrid", this) as Grid;
                if (_resizeGrip != null)
                    ExpandTextBox();

            }
        }

        private void ExpandTextBox()
        {
            _resizeGrip.MouseDown += (s, e) =>
            {
                LastPoint = Mouse.GetPosition(_resizeGrip);
                _dragInProgress = true;
            };
            Application.Current.MainWindow.MouseUp += (s, e) => _dragInProgress = false;
            Application.Current.MainWindow.MouseMove += (s, e) =>
            {
                if (_dragInProgress)
                {
                    var x = e.GetPosition(_expandableTextbox);
                    var y = _expandableTextbox.VerticalOffset;
                    Point point = Mouse.GetPosition(_resizeGrip);
                    var offset_x = point.X - LastPoint.X;
                    var offset_y = point.Y - LastPoint.Y;
                    var new_width = _expandableTextbox.RenderSize.Width;
                    var new_height = _expandableTextbox.RenderSize.Height;

                    new_width += offset_x;
                    new_height += offset_y;

                    if (new_width > 0 && new_height > 0)
                    {
                        _expandableTextbox.Width = new_width;
                        _expandableTextbox.Height = new_height;

                        var pointToscreen = _expandableTextbox.PointToScreen(x);
                        _expandableTextbox.SetValue(Canvas.LeftProperty, pointToscreen.X);
                        _expandableTextbox.SetValue(Canvas.TopProperty, pointToscreen.Y);

                        _mainGrid.Width = _expandableTextbox.Width;
                        _mainGrid.Height = _expandableTextbox.Height;

                        var translatePoint = _mainGrid.TranslatePoint(x, _mainGrid);
                        _mainGrid.SetValue(Canvas.LeftProperty, translatePoint.X);
                        _mainGrid.SetValue(Canvas.TopProperty, translatePoint.Y);

                        LastPoint = point;

                    }
                }
            };
        }
    }
    
 How to use this control in View?
 
 To use this control first add namespace to your UI like this
 
 xmlns:custom="clr-namespace:CustomControl.Controls"
 
 Now you can show ExpandableTextBox like this
 
 <custom:ExpandableTextBox/>

I hope this code help you. Happy Coding🙂

Comments

Popular posts from this blog

Filter DataGrid and ListView in wpf using ICollectionView

Pagination of DataGrid in WPF using MVVM

How to Create TabControl using Prism Region