| C#|如何从另一个类中绘制wpf?

时间:2015-09-22 16:46:34

标签: c# wpf drawing

好吧所以我知道的唯一方法就是在我将其设置为网格,面板等作为孩子之后添加你的形状。我已经尝试将它们添加到我的网格中,然后在另一个类中将它们公开,但最终只能进行无限循环。所以我的问题是如何有效地从wpf中的另一个网格上绘制。

2 个答案:

答案 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作为参考传递,则可以修改此类或其他类的行的开始或结束坐标。我希望这会有所帮助。