簡體   English   中英

| c#| 如何從另一個班級借鑒WPF?

[英]|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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM