[英]|c#| how to draw in wpf from another class?
好的,所以我所知道的繪制WPF的唯一方法是在將其設置為兒童網格,面板等之后添加形狀。 在將它們在另一個類中公開后,我嘗試將它們添加到網格中,但最終導致無限循環。 所以我的問題是如何在wpf中有效地從網格上的另一個類中提取內容。
所以我的問題是如何在wpf中有效地從網格上的另一個類中提取內容。
你不知道 您公開了將數據傳遞給封裝網格的類的方法,該類將執行驗證,如果合適,它將顯示適當的數據。 這樣,您就可以將模型與控制器分離。
好的,繪制wpf的唯一方法就是將兒童形狀設置為網格,面板等后添加形狀
WPF完全能夠顯示可寫位圖以及GDI +位圖。 實際上,這比為GPU添加多個形狀對象來處理和渲染一遍又一遍更好。
您必須以不同的方式思考。 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作為參考,則可以從此類或另一個類別中修改線的起點或終點坐標。 我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.