如何从其他类中绘制WPF

本文关键字:绘制 WPF 其他 | 更新日期: 2023-09-27 18:14:03

好的,所以我知道在wpf中绘制的唯一方法是在将其设置为网格,面板等后添加形状。我试过将它们添加到我的网格后,使它们在另一个类中公开,但最终只是使一个无限循环。所以我的问题是如何在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作为引用。