Привязка данных применяется к PathGeometry - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь отобразить простое изображение, привязав набор PathFigureCollection, определенный в Code-Behind, к свойству Figures соответствующего элемента пользовательского интерфейса. PropertyChanged в отладчике отображается как ноль, а цифры, которые я пытаюсь отобразить, не отображаются.

Я впервые использую привязку данных, поэтому я предполагаю, что проблема заключается в моем понимании этого. Большинство похожих проблем, которые я обнаружил, были решены путем установки переменной DataContext или установки Source вместо Path в XAML. Я реализовал эти решения, и они не решили мою проблему.

 <Window x:Class="DrawingSandBox.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:DrawingSandBox"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="754">
<Grid Margin="0,0,0,0">
    <Image HorizontalAlignment="Left" Height="400" Margin="10,10,10,10" VerticalAlignment="Bottom" Width="700" RenderTransformOrigin="0.5,0.5">
        <mage.RenderTransform>
            <TransformGroup>
                <ScaleTransform/>
                <SkewTransform/>
                <RotateTransform Angle="0"/>
                <TranslateTransform/>
            </TransformGroup>
        </Image.RenderTransform>
        <Image.Source>
            <DrawingImage>
                <DrawingImage.Drawing>
                    <GeometryDrawing Brush="Black">
                        <GeometryDrawing.Pen>
                            <Pen Thickness="11" Brush="Black"/>
                        </GeometryDrawing.Pen>
                        <GeometryDrawing.Geometry>
                            <PathGeometry Figures="{Binding Path=Frame, UpdateSourceTrigger=PropertyChanged}" /> 
                        </GeometryDrawing.Geometry>
                    </GeometryDrawing>
                </DrawingImage.Drawing>
            </DrawingImage>
        </Image.Source>
    </Image> 

</Grid>

namespace DrawingSandBox 
{
public partial class MainWindow : Window
{
    private static readonly CurveBuilder curve = new CurveBuilder();

    public MainWindow()
    {
        InitializeComponent();
        DataContext = curve;
    }
}
public class CurveBuilder : INotifyPropertyChanged
{

    private PointCollection points;
    private PolyBezierSegment seg;
    private PathFigureCollection frame;
    public event PropertyChangedEventHandler PropertyChanged;
    public PathFigure Figure;
    public PathFigureCollection Frame
    {
        get
        {
            return frame;
        }

        set
        {
            if (value != frame)
            {
                frame = value;
                NotifyPropertyChanged("Frame");
            }
        }
    }

    public CurveBuilder()
    {
        points = new PointCollection { new Point(20, 20), new Point(40, 40) };
        seg = new PolyBezierSegment(points, true);
        Figure = new PathFigure(new Point(50, 50), new PathSegmentCollection { seg }, false);
        Frame = new PathFigureCollection { Figure };
    }

    public void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

}
}

В нынешнем виде этот код просто отображает пустую страницу.

1 Ответ

1 голос
/ 22 мая 2019

Для отображения PolyBezierSegment необходимо минимум 3 пункта.

Согласно документации :

Определена кубическая кривая Безье.на четыре точки: начальная точка, конечная точка и две контрольные точки.PolyBezierSegment задает одну или несколько кубических кривых Безье, устанавливая свойство Points для набора точек.Для каждых трех точек в наборе первая и вторая точки определяют две контрольные точки кривой, а третья точка определяет конечную точку.

Переплет правильный.Добавьте еще один Point к своему PointCollection или используйте PolyQuadraticBezierSegment или QuadraticBezierSegment.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...