0

我目前正在做一个项目,该项目需要我使用画布才能在图片中的特定位置周围绘制矩形(以标记位置)

每个矩形(实际上是“矩形”,因为它也是我通过从Grid该类继承并包含一个矩形对象而创建的自定义类)包含有关图片内标记位置的属性和数据。我的主窗体包含诸如TextBox,DropDownLists等控件。

现在我要做的是,每次我点击“矩形”对象时,主表单控件都将填充对象数据。我无权从画布类访问这些控件。

此代码位于服装画布类中,用于将对象添加到画布中:

protected override void OnMouseLeftButtonDown( MouseButtonEventArgs e)
 {
   if(e.ClickCount==2)
    {
      testTi = new TiTest();
      base.OnMouseLeftButtonDown(e);
      startPoint = e.GetPosition(this);
      testTi.MouseLeftButtonDown += testTi_MouseLeftButtonDown;
      Canvas.SetLeft(testTi, e.GetPosition(this).X);
      Canvas.SetTop(testTi, e.GetPosition(this).X);
      this.Children.Add(testTi);
   }
}

并通过单击放置在画布内的对象,我想获取信息。现在只想确保我用一个简单的消息框得到正确的对象

void testTi_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  {
    MessageBox.Show(sender.GetType().ToString());         
  }

这是我的服装“矩形”课

class TiTest:Grid
{

    private Label tiNameLabel;
    private Rectangle tiRectangle;
    private String SomeText = string.Empty;
    private String version = "1.0";
    private String application = "CRM";
    private String CRID = "NNN";

    public String SomeText1
    {
        get { return SomeText; }
        set { SomeText = value; }
    }

    public Rectangle TiRectangle
    {
        get { return tiRectangle; }
        set { tiRectangle = value; }
    }
    public Label TiNameLabel
    {
        get { return tiNameLabel; }
        set { tiNameLabel = value; }
    }

    public TiTest()
    {
        this.SomeText = "Hello World!!";
        this.TiNameLabel = new Label
            {
                Content = "Test Item",
                VerticalAlignment = System.Windows.VerticalAlignment.Top,
                HorizontalAlignment = System.Windows.HorizontalAlignment.Left
            };
        TiRectangle = new Rectangle
          {
              Stroke = Brushes.Red,
              StrokeDashArray = new DoubleCollection() { 3 },//Brushes.LightBlue,
              StrokeThickness = 2,
              Cursor = Cursors.Hand,
              Fill = new SolidColorBrush(Color.FromArgb(0, 0, 111, 0))
          };
        Background= Brushes.Aqua;
        Opacity = 0.5;
        this.Children.Add(this.tiNameLabel);
        this.Children.Add(this.tiRectangle);


    }

}

有没有办法从服装画布类或服装矩形类访问主窗体控件?

提前致谢

4

1 回答 1

0

您可以将主窗口绑定到ViewModel保存矩形属性的单色。

视图模型

 public class MainWindowViewModel : INotifyPropertyChanged
{
    #region Singletone

    private static MainWindowViewModel _instance;

    private MainWindowViewModel()
    {

    }

    public static MainWindowViewModel Instance
    {
        get
        {
            if (_instance == null)
                _instance = new MainWindowViewModel();

            return _instance;
        }
    } 

    #endregion

    #region Properties

    private string _someInfo;
    public string SomeInfo
    {
        get 
        {
            return _someInfo; 
        }
        set
        {
            if (_someInfo != value)
            {
                _someInfo = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("SomeInfo"));
            }


        }
    }

    #endregion

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

在主窗口 xaml

<TextBox Text="{Binding SomeInfo}"/>

还将视图模型设置为主窗口数据上下文(例如在主窗口构造函数中)

this.DataContext = MainWindowViewModel.Instance;

最后,从您处理矩形 ( testTi_MouseLeftButtonDown) 的单击事件的位置,访问该MainWindowViewModel实例并相应地设置它的属性。

MainWindowViewModel.Instance.SomeInfo = myRectangle.SomeInfo;

这将触发PropertyChanged事件,这将更新主窗口上的控件。

如果你不熟悉 MVVM(模型,视图。视图模型)模式,你可以在这里阅读

希望这可以帮助

于 2013-09-22T07:56:23.433 回答