好吧所以我知道的唯一方法就是在我将其设置为网格,面板等作为孩子之后添加你的形状。我已经尝试将它们添加到我的网格中,然后在另一个类中将它们公开,但最终只能进行无限循环。所以我的问题是如何有效地从wpf中的另一个网格上绘制。
答案 0 :(得分:1)
所以我的问题是如何有效地从wpf中的另一个网格中绘制。
你不是。您公开了将数据传递给封装网格的类的方法,该类将执行验证,如果正确,它将显示其认为合适的数据。这样就可以实现模型与控制器的分离。
好吧所以我知道的唯一可以在wpf中绘制的方法是在将它设置为网格,面板等作为孩子之后添加你的形状
WPF完全能够显示可写位图以及GDI +位图。实际上,这比为GPU添加多个形状对象以便一次又一次地处理和渲染更为可取。
答案 1 :(得分:0)
你必须以不同的方式考虑这一点。 WPF的构建最适合MVVM编程风格。您的网格位于XAML代码中的视图需要绑定到包含业务逻辑的ViewModel上的属性。这将允许您从另一个类更新属性,然后更新绑定到该属性的View。
关于开始是一篇好文章: http://www.codeproject.com/Articles/819294/WPF-MVVM-step-by-step-Basics-to-Advance-Level
如果你进入WPF,我也建议买这本书: Pavel Yosifovich的Windows Presentation 4.5 Cookbook
您的网格应根据ViewModel中更改的绑定属性进行绘制。 例如,您可以根据绑定的内容在屏幕上移动线条形状。你的MainWindow看起来像这样:
<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>
然后你可以将MainWindow的DataContext集(通常是从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作为参考传递,则可以修改此类或其他类的行的开始或结束坐标。我希望这会有所帮助。