好的,所以我知道在wpf中绘制的唯一方法是在将其设置为网格,面板等后添加形状。我试过将它们添加到我的网格后,使它们在另一个类中公开,但最终只是使一个无限循环。所以我的问题是如何在wpf中有效地从网格上的另一个类中绘制。
所以我的问题是如何在wpf中有效地从网格上的另一个类中绘制。
你不。您公开方法将数据传递给封装网格的类,类将执行验证,如果合适,它将显示它认为合适的数据。这样就实现了模型与控制器的分离。
好的,我所知道的在wpf中绘制的唯一方法是在将其设置为grid, panel等子元素后添加形状
WPF完全能够显示可写位图,以及GDI+位图。事实上,这比添加多个形状对象让你的GPU一遍又一遍地处理和渲染要好得多。
你必须从不同的角度考虑这个问题。WPF是为了与MVVM编程风格一起工作而构建的。视图(XAML代码中网格所在的位置)需要绑定到包含业务逻辑的ViewModel上的属性。这将允许您从另一个类更新属性,然后更新绑定到该属性的视图。
是一篇关于开始的好文章:http://www.codeproject.com/Articles/819294/WPF-MVVM-step-by-step-Basics-to-Advance-Level
如果你想进入WPF,我也推荐你买这本书:Windows Presentation 4.5 Cookbook by Pavel Yosifovich
你的网格应该基于ViewModel中改变的绑定属性来绘制。例如,您可以让线条形状根据其绑定的内容在屏幕上移动。你的主窗口看起来像这样:
<Window x:Class="Grid_Drawing.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Grid_Drawing"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="MainGrid">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Canvas Height="300" Width="300">
<Line X1="{Binding StartX1}"
X2="{Binding EndX2}"
Y1="{Binding StartY1}"
Y2="{Binding EndY2}"
Stroke="Red"/>
</Canvas>
</Grid>
</Window>
然后你会有主窗口的数据上下文集(通常从App.Xaml.cs)到一个ViewModel类,称为类似DrawingViewModel继承自INotifyPropertyChanged (WPF中最重要的接口)。你的类看起来像:
public class DrawingViewModel : INotifyPropertyChanged
{
private double _startX1;
private double _endX2;
private double _startY1;
private double _endY2;
// properties
public double StartX1
{
get { return _startX1; }
set
{
if (_startX1 != value)
{
_startX1 = value;
OnPropertyChanged("StartX1");
}
}
}
public double EndX2
{
get { return _endX2; }
set
{
if (_endX2 != value)
{
_endX2 = value;
OnPropertyChanged("EndX2");
}
}
}
public double StartY1
{
get { return _startY1; }
set
{
if (_startY1 != value)
{
_startY1 = value;
OnPropertyChanged("StartY1");
}
}
}
public double EndY2
{
get { return _endY2; }
set
{
if (_endY2 != value)
{
_endY2 = value;
OnPropertyChanged("EndY2");
}
}
}
// end properties
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
然后你可以从这个类或其他类修改线的开始或结束坐标,如果你传递DrawingViewModel作为引用。