あなたが探しているのは、既存のコントロール (CustomControl) os 新しいコントロールの作成から継承することであり、その中にコントロールを追加することができます (UserControl)。1 つのコントロール (Label や TextBox など) のカスタム クラスであることが想定されている場合は、CustomControl で解決しようとします。
名前は WinForms と WPF で同じです。いくつかのリンクを提供できますが、ニーズに最も適した例/チュートリアルを見つけることができるように、Google で検索する方がよいと思います。
編集
わかりましたので、バックグラウンドにもよりますが、WinForms はもう少しシンプルです。ただし、プロのプログラムを作成する場合は、おそらく WPF が適しています。(WinForms はちょっと古い)
Winフォーム
少なくとも、WinForm CustomControl の非常に短く単純な例を次に示します。
namespace BorderLabelWinForms
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
public class BorderLabel : Label
{
private bool _showBorder = false;
protected override void OnMouseClick(MouseEventArgs e)
{
_showBorder = !_showBorder;
base.OnMouseClick(e);
this.Refresh();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (_showBorder)
{
Pen pen = new Pen(new SolidBrush(Color.Black), 2.0f);
e.Graphics.DrawRectangle(pen, this.ClientRectangle);
pen.Dispose();
}
}
}
}
そして、そこから進んで拡張することができます。
WPF
WPF はより複雑ですが、CustomControl を作成するには、プロジェクト ビューでプロジェクトを右クリックし、[追加] > [新しい項目] を選択します。ポップアップするダイアログで、カスタム コントロール (WPF) を選択します。これで、新しい {choosen name}.cs (私の例では BorderLable) とディレクトリが作成されます。テーマと Generic.xaml ファイル。Generic ファイルは、コントロールの構築方法を説明するリソースです。たとえば、ここでは CustomControl にラベルを追加しました。
Generic.xaml:
<Style TargetType="{x:Type local:BorderLabel}">
<Style.Resources>
<local:ThicknessAndBoolToThicknessConverter x:Key="tabttc" />
</Style.Resources>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:BorderLabel}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}" >
<Border.BorderThickness>
<MultiBinding Converter="{StaticResource tabttc}" >
<Binding Path="BorderThickness" RelativeSource="{RelativeSource TemplatedParent}" />
<Binding Path="ShowBorder" RelativeSource="{RelativeSource TemplatedParent}" />
</MultiBinding>
</Border.BorderThickness>
<Label Content="{TemplateBinding Content}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
BorderLable.cs:
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 BorderButton
{
/// <summary>
/// Bla. bla bla...
/// </summary>
public class BorderLabel : Label
{
//DependencyProperty is needed to connect to the XAML
public bool ShowBorder
{
get { return (bool)GetValue(ShowBorderProperty); }
set { SetValue(ShowBorderProperty, value); }
}
public static readonly DependencyProperty ShowBorderProperty =
DependencyProperty.Register("ShowBorder", typeof(bool), typeof(BorderLabel), new UIPropertyMetadata(false));
//Override OnMouseUp to catch the "Click". Toggle Border visibility
protected override void OnMouseUp(MouseButtonEventArgs e)
{
base.OnMouseUp(e);
ShowBorder = !ShowBorder;
}
//Contructor (some default created when selecting new CustomControl)
static BorderLabel()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(BorderLabel), new FrameworkPropertyMetadata(typeof(BorderLabel)));
}
}
//So doing it the WPF way, I wanted to bind the thickness of the border
//to the selected value of the border, and the ShowBorder dependency property
public class ThicknessAndBoolToThicknessConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values[0] is Thickness && values[1] is bool)
{
Thickness t = (Thickness)values[0];
bool ShowBorder = (bool)values[1];
if (ShowBorder)
return t;
else
return new Thickness(0.0d);
}
else
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
最後に、コントロールを MainWindow に追加する必要があります。
<Window x:Class="BorderButton.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BorderButton"
Title="MainWindow" Height="350" Width="525">
<Grid>
<!-- Note that the BorderThickness has to be set to something! -->
<local:BorderLabel Content="HelloWorld" Margin="118,68,318,218" MouseUp="BorderLabel_MouseUp" BorderBrush="Black" BorderThickness="2" ShowBorder="False" />
</Grid>
</Window>
ご覧のとおり、WPF はやや複雑です... とにかく、これで 2 つの例から始めることができます! それが役に立てば幸い。