我目前正在开发一个项目,要求我使用画布以在图片中的特定位置周围绘制矩形(以标记位置)
每个矩形(实际上是“矩形”,因为它也是我通过继承自Grid
类并包含矩形对象而创建的自定义类),包含有关图片内标记位置的属性和数据。
我的主要表单包含TextBox
,DropDownLists
等控件。
现在我要做的是,每次点击“矩形”对象时,主窗体控件都将填充对象数据。 我无权访问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);
}
}
有没有办法从服装画布类或服装矩形类访问主窗体控件?
提前致谢
答案 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
希望这有帮助