Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 通过画布内的触发器事件更改主窗体控件_Wpf - Fatal编程技术网

Wpf 通过画布内的触发器事件更改主窗体控件

Wpf 通过画布内的触发器事件更改主窗体控件,wpf,Wpf,我目前正在从事一个项目,该项目要求我使用画布围绕图片中的特定位置绘制矩形(以标记位置) 每个矩形(实际上是“矩形”,因为它也是我从网格类继承创建的自定义类,并且包含一个矩形对象)包含有关图片中标记位置的属性和数据。 我的主窗体包含控件,如文本框,下拉列表等 现在我要做的是,每次单击“矩形”对象时,主窗体控件都将填充对象数据。 我无法从canvas类访问这些控件 此代码位于Costum canvas类中,用于将对象添加到画布中: protected override void OnMouseLef

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

每个矩形(实际上是“矩形”,因为它也是我从
网格
类继承创建的自定义类,并且包含一个矩形对象)包含有关图片中标记位置的属性和数据。 我的主窗体包含控件,如
文本框
下拉列表

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

此代码位于Costum 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);
   }
}
通过点击画布中的一个物体,我想要得到信息。 现在,我只想确保通过一个简单的messagebox获得正确的对象

void testTi_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  {
    MessageBox.Show(sender.GetType().ToString());         
  }
这是我的服装“长方形”课

有没有办法从costure canvas类或costure rectangle类访问主窗体控件


提前感谢

您可以将主窗口绑定到保存矩形属性的单音视图模型

视图模型

 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}"/>
最后,从处理矩形的单击事件(
testTi\u MouseLeftButtonDown
)的位置,访问
MainWindowViewModel
实例并相应地设置其属性

MainWindowViewModel.Instance.SomeInfo = myRectangle.SomeInfo;
这将触发
PropertyChanged
事件,该事件将更新主窗口上的控件

如果您不熟悉MVVM(Model,View.View Model)模式,您可以阅读它


希望这有帮助

侧注-为什么要通过继承
网格
类而不是类或类本身来创建自定义矩形?您好,因为我需要一种方法将文本标签添加到标记对象。无法将标签添加到矩形,所以我使用了网格,以便可以将子项(标签和矩形)添加到该网格中矩形大小实际上就是网格大小。你能发布一些代码吗?非常感谢你的快速响应!
this.DataContext = MainWindowViewModel.Instance;
MainWindowViewModel.Instance.SomeInfo = myRectangle.SomeInfo;