Telerik Forums
UI for WPF Forum
1 answer
191 views
Example : RadComboBox conatains below list
Computer
Computer Engineer
Free
Free trial

When I type "Comp" in text area of RadCombox it should auto complete with default selection that is "Computer" in text area
and show drop down with "Computer" and "Computer Engineer"
Dilyan Traykov
Telerik team
 answered on 09 May 2018
12 answers
2.6K+ views
What is the WPF equivalent of the TextChanged event?  I have a RadComboBox that allows editing and when the text changes I need to raise perform some work.

Thanks in advance,
Lee
Martin Ivanov
Telerik team
 answered on 09 May 2018
3 answers
133 views

Hello,

I'm using a RadDiagram where the users can add images and draw arrows.

By default, when the user draws an arrow over a shape, the arrow connects to the closest connection point. I need to modify this behavior. When the ActiveTool is ConnectorTool and the user clicks on the image, the arrow must start from the point where the user clicked, and not from the closest connection point.

 

In order to achieve this, I removed all connection points from the image when I add it. This didn't work as expected.

The following code sample allows me te reproduce the error. When I click outside the image, the behavior is nominal.

When I click on the image, an exception is thrown. Instead, I want the application to behave as if the image wasn't there.

In my sample, the ActiveTool is always ConnectorTool, but in my real application, the ActiveTool can have other values. This behavior must only apply to the ConnectorTool. For example, when the PointerTool is active, the user must be able to select and move the image.

 

 

 

 

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        TestWindow win = new TestWindow();
        win.ShowDialog();
    }
}
 
 
class TestWindow : Window
{
    public TestWindow()
    {
        Grid main_grid = new Grid();
        main_grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
        main_grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });
 
        RadDiagram my_diagram = new RadDiagram();
        my_diagram.ActiveTool = Telerik.Windows.Diagrams.Core.MouseTool.ConnectorTool;
        Grid.SetColumn(my_diagram, 1);
 
        ViewModel vm = new ViewModel(my_diagram);
 
        Button button_add_image = new Button();
        button_add_image.Content = "Add image";
        button_add_image.Command = vm.CommandAddImage;
 
        AddChild(main_grid);
        main_grid.Children.Add(my_diagram);
        main_grid.Children.Add(button_add_image);
 
        DataContext = vm;
    }
}
 
class ViewModel : ViewModelBase
{
    public ViewModel(RadDiagram diagram)
    {
        MyDiagram = diagram;
    }
 
    public RadDiagram MyDiagram { get; set; }
    public ICommand CommandAddImage { get { return new ICommandImpl(AddImage); } }
 
    public void AddImage()
    {
        Microsoft.Win32.OpenFileDialog open_file_dialog = new Microsoft.Win32.OpenFileDialog();
        open_file_dialog.Filter = "Image Files (*.png, *.jpg, *.bmp)|*.png;*.jpg;*.bmp";
        open_file_dialog.CheckFileExists = true;
 
        if (!open_file_dialog.ShowDialog().GetValueOrDefault() || !System.IO.File.Exists(open_file_dialog.FileName))
        { return; }
 
        System.Windows.Media.Imaging.BitmapImage image_source = new System.Windows.Media.Imaging.BitmapImage(new Uri(open_file_dialog.FileName));
        System.Windows.Controls.Image image_displayed = new System.Windows.Controls.Image();
        image_displayed.Source = image_source;
        Viewbox viewbox_added_to_diagram = new Viewbox();
        viewbox_added_to_diagram.Stretch = Stretch.Fill;
        viewbox_added_to_diagram.Margin = new System.Windows.Thickness(-4);
        viewbox_added_to_diagram.Child = image_displayed;
 
        RadDiagramShape shape_added_to_diagram = new RadDiagramShape();
        shape_added_to_diagram.Content = viewbox_added_to_diagram;
        shape_added_to_diagram.Background = Brushes.Transparent;
        shape_added_to_diagram.BorderBrush = Brushes.Green;
 
        shape_added_to_diagram.Connectors.Clear();
        MyDiagram.AddShape(shape_added_to_diagram, new Point(20, 20));
    }
 
 
    private class ICommandImpl : ICommand
    {
        private Action Command;
        public ICommandImpl(Action p_action) { Command = p_action; }
        public void Execute(object parameter) { Command(); }
        public bool CanExecute(object parameter) { return true; }
        public event EventHandler CanExecuteChanged;
    }
}

 

 

I followed the instructions in another post, but I didn't manage to make it work.

I used added the following tool, but the behavior is not what I need. Now, when I click on a shape, nothing happens. I want a new connection to start when I click on a shape.

class CustomConnectionTool : ConnectionTool
{
    public override bool MouseDown(PointerArgs e)
    {
        if (!this.IsActive) return false;
 
        var hitItem = this.HitTestService.ItemUnderMouse as IShape;
        if (hitItem == null || hitItem.Connectors.Count > 0)
            return base.MouseDown(e);
        else
            return false;
    }
}

 

The post suggested creating a new service or a custom tool, but I couldn't figure it out. In addition, my real application has more styles and custom behavior associated with Connections, so I'd rather not use a different class.

 

How else can I achieve what I need ? When the user clicks a shape, it must not start from the closest connection, but must instead start from the point where the user clicked.

Petar Mladenov
Telerik team
 answered on 08 May 2018
3 answers
153 views

Hi,

How can clear the "FieldFilter" value?

I have set FilteringMode="FilterRow" on my grid.

 

Until now I tried:

foreach (var column in gridWithFilters.Columns)
{
    column.ClearFilters();
    column.ColumnFilterDescriptor.Clear();
  column.ColumnFilterDescriptor.FieldFilter.Clear();
}

but this clear the filter, but not its value!

 

I have also tried:

foreach (var column in gridWithFilters.Columns)
{
    IColumnFilterDescriptor countryFilter = column.ColumnFilterDescriptor;
    countryFilter.SuspendNotifications();
    column.ColumnFilterDescriptor.FieldFilter.Filter1.Value = "";
    column.ColumnFilterDescriptor.FieldFilter.Filter1.Operator = FilterOperator.Contains;
    countryFilter.ResumeNotifications();
}

but I get an error: "Input string was not in a correct format."

 

Is it possible to clear the "FieldFilter" value?

 

Thanks!

Beata

 

Vladimir Stoyanov
Telerik team
 answered on 08 May 2018
8 answers
294 views

Hi,

I found how to add the zoom but I can't find a way to add the pan.

<imaging:ZoomController Grid.Row="0" ImageEditor="{Binding ElementName=ImageEditor}"  Margin="0 8"/>   

 

Thank you

Vladimir Stoyanov
Telerik team
 answered on 08 May 2018
1 answer
67 views

Hi,

Am writing an application using Radpanelbar . My application has different operation like

PanelBar

*********************************

1) Create

    a.Step1 --> View1.xaml -> screen1

    b. Step2 --> View2.xaml --> screen2

     c. Step3 --> View3.xaml --> screen 3

2) Modify

3) Delete

*************************************

Each operation has various stages (screens/views). When user clicks Create step1  my application should load View1.xaml. 

if he clicks step2 , it should load view2.xaml and so on.

 

Qn

These Views/viewmodels are already created and stored in Unitycontainer. I just need to load these views when user navigates in the panelbar items.

Can someone help me with this ?

 

 

 

Martin Ivanov
Telerik team
 answered on 08 May 2018
2 answers
160 views

Scheduleview does not fit in available size and it display scrollbars. We want to display scheduleview without horizontal scrollbar.

 

Please find attached snapshot for same.

 

Thanks

Ajay
Top achievements
Rank 1
 answered on 08 May 2018
4 answers
248 views

i m starting to learn WPF right now, and i am a newbie for it.

what i am asking is  i want to make simple program using radrichtextbox like outline view in MS Word, but i have no idea to make it realized, 

i often read Documentation that i have from Telerik, but there is something that i dont understand about it, so would you like to guide me what step that should i do 

to make simple program like this.

actually i want to know, what is document in raddocument type(exp maybe list type, or array type or json)? what can i get the value of paragraph and how to make it in tree visual..

before that, i would like to say thank you and  i hope someone guide me to this.

 

thanks in advanced

 

 

 

 

 

Boby
Telerik team
 answered on 08 May 2018
0 answers
47 views

How to set keyboard focus on Day or Week header button?  See the attached screenshot. 

Or I would like also implement hotkeys to set keyboard focus either of those header buttons(Day, Week or Month). 

Benji
Top achievements
Rank 1
 asked on 07 May 2018
10 answers
528 views

Hello,

See below code. I need help with the following 2 items:

1. In ControlTemplate the RadGridView has IsReadyOnly=true but for "Select" column (checkbox) I want the IsReadOnly=false

2. AllowMultipleSelection="True" for the Combobox but the DisplayMemberPath is not showing the multiple names selected (from the ControlTemplate)

===========================================================================================================

<UserControl x:Class="DropDownWithHeaders.Example"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
mc:Ignorable="d"
DataContext="{StaticResource ViewModel}"
d:DesignHeight="300" d:DesignWidth="300">
<StackPanel>
<StackPanel Margin="10">
<TextBlock Text="NonEditable ComboBox" />
<telerik:RadComboBox x:Name="nonEditableCombo"
MinWidth="300"
HorizontalAlignment="Left"
ItemsSource="{Binding Materials}"
NonEditableTemplate="{StaticResource NonEditableComboBox}"
DisplayMemberPath="Name"
VerticalAlignment="Top"
StaysOpenOnEdit="True"
AllowMultipleSelection="True"
SelectedItem="{Binding SelectedMaterial, Mode=TwoWay}">
</telerik:RadComboBox>
</StackPanel>
</StackPanel>
</UserControl>

===========================================================================================================

<ControlTemplate x:Key="NonEditableComboBox" TargetType="telerik:RadComboBox">
                <Grid x:Name="VisualRoot">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Content" Storyboard.TargetProperty="Opacity">
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="0.5"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="DropDownIcon" Storyboard.TargetProperty="Opacity">
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="0.5"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DropDownIcon" Storyboard.TargetProperty="Foreground">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonIconForeground_Disabled}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DropDownIcon" Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonIconBackground_Disabled}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonChrome" Storyboard.TargetProperty="RenderEnabled">
                                        <DiscreteObjectKeyFrame KeyTime="0:0:0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <sys:Boolean>False</sys:Boolean>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="ButtonChrome" Storyboard.TargetProperty="Opacity">
                                        <DiscreteDoubleKeyFrame KeyTime="0:0:0" Value="0.6"/>
                                    </DoubleAnimationUsingKeyFrames>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="DisabledBorder" Storyboard.TargetProperty="Opacity">
                                        <DiscreteDoubleKeyFrame KeyTime="0" Value="1"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonChrome" Storyboard.TargetProperty="RenderMouseOver">
                                        <DiscreteObjectKeyFrame KeyTime="0:0:0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <sys:Boolean>True</sys:Boolean>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DropDownIcon" Storyboard.TargetProperty="Foreground">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonIconForeground_MouseOver}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DropDownIcon" Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonIconBackground_MouseOver}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="DropDownOpen">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DropDownIcon" Storyboard.TargetProperty="Foreground">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonIconForeground_Pressed}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="DropDownIcon" Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonIconBackground_Pressed}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="FocusStates">
                            <VisualState x:Name="Focused"/>
                            <VisualState x:Name="Unfocused"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border IsHitTestVisible="False" Background="{TemplateBinding Background}" CornerRadius="{StaticResource SplitButton_SpanCornerRadius}"/>
                    <telerik:RadToggleButton x:Name="PART_DropDownButton" Foreground="{TemplateBinding Foreground}" IsTabStop="False" Margin="0" Padding="0" ClickMode="Press">
                        <telerik:RadToggleButton.Template>
                            <ControlTemplate TargetType="telerik:RadToggleButton">
                                <ContentPresenter/>
                            </ControlTemplate>
                        </telerik:RadToggleButton.Template>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                           
                            <Border x:Name="DisabledBorder"
                                    IsHitTestVisible="False"
                                    BorderBrush="{StaticResource ControlOuterBorder_Disabled}"
                                    BorderThickness="{TemplateBinding BorderThickness}"
                                    Opacity="0"
                                    CornerRadius="{StaticResource SplitButton_SpanCornerRadius}"
                                    Grid.ColumnSpan="2"/>
                           
                            <telerikChromes:ButtonChrome x:Name="ButtonChrome"
                                    Grid.ColumnSpan="2"
                                    CornerRadius="{StaticResource SplitButton_SpanCornerRadius}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}"
                                    RenderPressed="{TemplateBinding IsDropDownOpen}"
                                    RenderFocused="{TemplateBinding IsFocused}"
                                    RenderEnabled="{TemplateBinding IsEnabled}"
                                    RenderMouseOver="{TemplateBinding IsMouseOver}"/>
                           
                            <Border Grid.ColumnSpan="2"
                                    Background="{TemplateBinding Background}"
                                    IsHitTestVisible="False"
                                    CornerRadius="{StaticResource SplitButton_SpanCornerRadius}"
                                    Margin="1"/>
                           
                            <ContentControl x:Name="DropDownIcon"
                                    Grid.Column="1"
                                    IsTabStop="False"
                                    Foreground="{StaticResource ButtonIconForeground_Normal}"
                                    Background="{StaticResource ButtonIconBackground_Normal}"
                                    Template="{StaticResource ArrowTemplateNonEditableCombobox}"/>
                           
                            <ContentPresenter x:Name="Content"
                                    Grid.Column="0"
                                    Margin="{TemplateBinding Padding}"
                                    IsHitTestVisible="False"
                                    Content="{TemplateBinding SelectionBoxItem}"
                                    ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                                    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Grid>
                    </telerik:RadToggleButton>
                    <Popup x:Name="PART_Popup">
                        <Grid x:Name="PopupRoot">
                            <Border
                                    BorderThickness="{TemplateBinding BorderThickness}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    MinWidth="{TemplateBinding MinDropDownWidth}"
                                    MaxHeight="{TemplateBinding MaxDropDownHeight}"
                                    Background="{StaticResource PickerPopupBackground}"
                                    CornerRadius="{StaticResource SplitButton_SpanCornerRadius}"
                                    x:Name="PART_ResizeBorder">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="*"/>
                                    </Grid.RowDefinitions>
                                    <telerik:RadButton x:Name="PART_ClearButton"
                                            Grid.Row="0"
                                            Margin="-1 -1 -1 0"
                                            Visibility="{TemplateBinding ClearSelectionButtonVisibility}"
                                            Content="{TemplateBinding ClearSelectionButtonContent}"/>
                                    <ScrollViewer x:Name="PART_ScrollViewer"
                                            Grid.Row="1"
                                            Foreground="{TemplateBinding Foreground}"
                                            Padding="0 1 0 0"
                                            BorderThickness="0"
                                            HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
                                            VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
                                            CanContentScroll="True">
                                            <!--<ItemsPresenter/>-->
                                        <telerik:RadGridView ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource TemplatedParent}}"
                                                                 RowIndicatorVisibility="Collapsed"
                                                                 EnableLostFocusSelectedState="False"
                                                                 SelectedItem="{Binding SelectedItem, RelativeSource={RelativeSource TemplatedParent}}"
                                                                 ShowGroupPanel="False" IsFilteringAllowed="False" IsReadOnly="False"
                                                                 DataLoaded="RadGridView_DataLoaded" />
                                    </ScrollViewer>
                                </Grid>
                            </Border>
                        </Grid>
                    </Popup>
                </Grid>
            </ControlTemplate>

 

private void RadGridView_DataLoaded(object sender, EventArgs e)
{
var radGridViewobj = (sender as RadGridView);
List<string> colNames = new List<string>();
foreach(Telerik.Windows.Controls.GridViewColumn column in radGridViewobj.Columns)
{
if (column is GridViewDataColumn)
{
var currentCol = column as GridViewDataColumn;
if (currentCol.DataType.Equals(typeof(bool)))
currentCol.IsReadOnly = false;
}
}
}

===========================================================================================================

public class ViewModel: ViewModelBase
{
public ObservableCollection<Material> Materials { get; set; }
public ViewModel()
{
this.Materials = new ObservableCollection<Material>
{
new Material { Select=false, Id = 1, Name = "Item 1", Type = "Material Type 1", Description="Description 1" },
new Material { Select=true, Id = 2, Name = "Item 2", Type = "Material Type 2", Description="Description 2" },
new Material { Select=true, Id = 3, Name = "Item 3", Type = "Material Type 3", Description="Description 3" },
new Material { Select=false, Id = 4, Name = "Item 4", Type = "Material Type 4", Description="Description 4" },
new Material { Select=true, Id = 5, Name = "Item 5", Type = "Material Type 5", Description="Description 5" },
};
}
private Material selectedMaterial;
public Material SelectedMaterial
{
get
{
return this.selectedMaterial;
}
set
{
if (this.selectedMaterial != value)
{
this.selectedMaterial = value;
this.OnPropertyChanged(() => this.SelectedMaterial);
}
}
}
}

===========================================================================================================

public class Material
{
public bool Select { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public string Description { get; set; }
}

===========================================================================================================

 

Thanks,

Sri

Sri
Top achievements
Rank 1
 answered on 07 May 2018
Narrow your results
Selected tags
Tags
GridView
General Discussions
Chart
RichTextBox
Docking
ScheduleView
ChartView
TreeView
Diagram
Map
ComboBox
TreeListView
Window
RibbonView and RibbonWindow
PropertyGrid
DragAndDrop
TabControl
TileView
Carousel
DataForm
PDFViewer
MaskedInput (Numeric, DateTime, Text, Currency)
AutoCompleteBox
DatePicker
Buttons
ListBox
GanttView
PivotGrid
Spreadsheet
Gauges
NumericUpDown
PanelBar
DateTimePicker
DataFilter
Menu
ContextMenu
TimeLine
Calendar
Installer and Visual Studio Extensions
ImageEditor
BusyIndicator
Slider
Expander
TileList
PersistenceFramework
DataPager
Styling
TimeBar
OutlookBar
TransitionControl
Book
FileDialogs
ToolBar
ColorPicker
TimePicker
SyntaxEditor
MultiColumnComboBox
VirtualGrid
Wizard
ExpressionEditor
NavigationView (Hamburger Menu)
DesktopAlert
WatermarkTextBox
BarCode
SpellChecker
DataServiceDataSource
EntityFrameworkDataSource
RadialMenu
ChartView3D
Data Virtualization
BreadCrumb
ProgressBar
Sparkline
LayoutControl
TabbedWindow
ToolTip
CloudUpload
ColorEditor
TreeMap and PivotMap
EntityFrameworkCoreDataSource (.Net Core)
HeatMap
Chat (Conversational UI)
VirtualizingWrapPanel
Calculator
NotifyIcon
TaskBoard
TimeSpanPicker
BulletGraph
WebCam
CardView
DataBar
Licensing
FilePathPicker
PasswordBox
Rating
SplashScreen
Accessibility
Callout
CollectionNavigator
Localization
AutoSuggestBox
VirtualKeyboard
HighlightTextBlock
Security
TouchManager
StepProgressBar
Badge
OfficeNavigationBar
ExpressionParser
CircularProgressBar
SvgImage
PipsPager
SlideView
AI Coding Assistant
+? more
Top users last month
Ambisoft
Top achievements
Rank 2
Iron
Pascal
Top achievements
Rank 2
Iron
Matthew
Top achievements
Rank 1
Sergii
Top achievements
Rank 1
Andrey
Top achievements
Rank 1
Want to show your ninja superpower to fellow developers?
Top users last month
Ambisoft
Top achievements
Rank 2
Iron
Pascal
Top achievements
Rank 2
Iron
Matthew
Top achievements
Rank 1
Sergii
Top achievements
Rank 1
Andrey
Top achievements
Rank 1
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?