通过canvas中的触发器事件更改主窗体控件

时间:2013-09-22 07:41:02

标签: wpf

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

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

现在我要做的是,每次点击“矩形”对象时,主窗体控件都将填充对象数据。 我无权访问canvas类中的那些控件。

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

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);


    }

}

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

提前致谢

1 个答案:

答案 0 :(得分: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}"/>

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

this.DataContext = MainWindowViewModel.Instance;

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

MainWindowViewModel.Instance.SomeInfo = myRectangle.SomeInfo;

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

如果您不熟悉MVVM(模型,视图。视图模型)模式,您可以阅读它here

希望这有帮助