0

WPFとWindowsフォームは初めてです。コントロールのカスタムクラス(たとえば、LabelやTextBox ...)を定義し、その外観を定義し、そのコントロールの任意のイベントのカスタムメソッドを作成する方法を知る必要があります。クリックすると、ラベルの周りに黒い境界線を配置するようなものです。

そのクラスのインスタンスを必要な数だけ動的に作成できるように、これらすべてを実行する必要があります。すべてインスタンスが同じ機能と外観を備えていることを確認してください。

これについての簡単なチュートリアルはありますか?

4

2 に答える 2

5

あなたが探しているのは、既存のコントロール (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 つの例から始めることができます! それが役に立てば幸い。

于 2012-12-04T12:15:27.847 に答える
0

これが私が投稿した以前の回答のリンクです。誰かがボタンとカスタムプロパティ/設定に興味を持っていました。また、コントロールのサンプリングと学習、テンプレートのカスタマイズなどを開始し、前述のプロパティを利用する方法も示しています。これは、「トリガー」(バインドできる依存関係プロパティに関連付けられている)を介してイベントを操作することで拡張できます。

他にもたくさんのサンプルが見つかると思いますが、これはおそらく、その間に壁を叩いて頭を痛めないようにするのに役立ちます:)

于 2012-12-04T12:20:49.490 に答える