1

長いサイクルで省略記号を追加しています(100以上が追加されています)。同じクリックイベントでサイクルに追加されたプロパティを知りたいです。forサイクル内:

 var ellipse = new Ellipse();
 ellipse.myValue=12; // this needs to be editable and working
 ....
 ellipse.MouseDown += ellipseClick;
 canvas2.Children.Add(ellipse);

リスナーは次のとおりです。

private void ellipseClick(object sender, MouseButtonEventArgs e)
    {
        if(myValue==12) 
        ....
    }

もちろん、もう少し複雑です。すべての楕円にポインタまたは3つのint値が必要です。すべての楕円に移動してクリック位置を確認し、それが送信者と同じであるかどうかを確認したくありません。Ellipseクラスは封印されているため拡張できません。また、Ellipseクラスのコードを書き直すこともできません。

4

4 に答える 4

3

プロパティを使用できますTagが、汎用タグは winform の時代の名残です。ここでそれについて読んでください。私が気に入らないのは、タグがタイプされていないことです。つまり、キャストして読み取ることを意味し、意味のある名前がありません。別の方法は次のとおりです。

添付プロパティ

幸いなことに、VSにはスニペットタイプとプレスタブがpropaあります。

そう:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Shapes;

namespace SO_AttachmentProperty
{
    public sealed class EllipseAttachments
    {
        #region Field1
        public static int GetField1(DependencyObject obj)
        {
            return (int)obj.GetValue(Field1Property);
        }

        public static void SetField1(DependencyObject obj, int value)
        {
            obj.SetValue(Field1Property, value);
        }

        // Using a DependencyProperty as the backing store for Field1.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty Field1Property =
            DependencyProperty.RegisterAttached("Field1", typeof(int), typeof(EllipseAttachments), new UIPropertyMetadata(0));
        #endregion

        #region Field2
        public static int GetField2(DependencyObject obj)
        {
            return (int)obj.GetValue(Field2Property);
        }

        public static void SetField2(DependencyObject obj, int value)
        {
            obj.SetValue(Field2Property, value);
        }

        // Using a DependencyProperty as the backing store for Field2.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty Field2Property =
            DependencyProperty.RegisterAttached("Field2", typeof(int), typeof(EllipseAttachments), new UIPropertyMetadata(0));
        #endregion
    }
}

次に、次のようにプロパティを使用します。

コード内

var ellipse = new Ellipse();

//write
EllipseAttachments.SetField1(ellipse, 123);
EllipseAttachments.SetField2(ellipse, 456);

//read
var f1 = EllipseAttachments.GetField1(ellipse);
var f2 = EllipseAttachments.GetField2(ellipse);

添付ファイルのプロパティは、xaml で独自のものになり ます。ローカル名前空間に注意してください。

<Window x:Class="SO_AttachmentProperty.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SO_AttachmentProperty"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Ellipse local:EllipseAttachments.Field1="789" local:EllipseAttachments.Field2="67"/>
    </Grid>
</Window>
于 2012-11-16T19:50:43.903 に答える
2

Tag-property を使用して追加情報を保存できます。

ellipse.Tag = 12;

それがあなたの求めているものであることを願っていますが、私の質問に対するコメントによると、各楕円に情報を保存したいだけです。

必要なすべての情報を含む構造体またはクラスを作成し、Tagそのクラスに設定するだけです。必要なものは何でも保存できます。

于 2012-11-16T19:33:25.763 に答える
2

オブジェクトを保持する Tag プロパティを使用できます。好きなものをそこに置くことができ、任意の数の値を保持できるクラスを作成できます。このようなことができます。  

var ellipse = new Ellipse();
ellipse.Tag=12;



private void ellipseClick(object sender, MouseButtonEventArgs e)
{
    Ellipse ellipse = (Ellipse)sender;
    int value = (int)ellipse.Tag           
    if(value==12) 
    ....
}
于 2012-11-16T19:34:08.360 に答える
0

楕円を含み、統一された方法でマウス オーバーを処理するカスタム コントロールを作成します。カスタム コントロール (おそらく他のすべてのコントロールの依存関係プロパティ) 内で、他の省略記号について知り、必要に応じて送信者情報を取得する機能を提供します。

于 2012-11-16T19:36:20.323 に答える