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 类,因为它是密封的,我不能重写 Ellipse 类中的代码。

4

4 回答 4

3

您可以使用Tag属性,但通用标签是 winforms 时代的遗留物。在这里阅读。我不喜欢标签是它们没有类型,这意味着要从中读取,并且它们没有有意义的名称。另一种选择是:

附件属性

很难写,幸运的是 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 回答