Специфическое связывание в C # / WPF - PullRequest
1 голос
/ 23 мая 2011

Это снова я с моими привязками:)

Вот проблема, мне нужно, чтобы на моей GRID было два элемента управления, связанных с LINE. Таким образом, я могу перемещать с помощью мыши один из элементов управления вокруг GRID и LINE, которые соединяют эти два элемента управления должны быть немедленно заменены при движении.

Есть идеи? Я думал, что вычислить новые X1, Y1, X2, Y2 линии LINE на каждое движение 1px невозможно и очень быстро ... Так что я думаю, что есть способ создать BINDINGS для линий X1, Y1, X2, Y2, таких как:

x1={Binding firstCtrl.Position.X+firstCtrl.Width/2}

Но такое связывание очень сложно (для меня) даже в XAML, но мне нужно динамически создавать такое связывание в коде C #.

Вам снова нужен совет, как создать такую ​​привязку в C # или есть другой способ реализовать мою идею?

P.S. "Мне не нужен весь код для этого, только описание и, может быть, простой пример кода."

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Попробуйте:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <ResourceDictionary>
        <ControlTemplate x:Key="template1">
            <Ellipse Width="30" Margin="-15 -15" Height="30" Fill="Black"/>
        </ControlTemplate>
    </ResourceDictionary>
</Window.Resources>

<Canvas Name="myCanvas">
    <Thumb Name="myThumb" DragDelta="onDragDelta" Canvas.Left="0" Canvas.Top="30" Template="{StaticResource template1}"/>
    <Thumb Name="myThumb2" DragDelta="onDragDelta" Canvas.Left="400" Canvas.Top="30" Template="{StaticResource template1}"/>
    <Line X1="{Binding ElementName=myThumb,Path=(Canvas.Left)}" Y1="{Binding ElementName=myThumb,Path=(Canvas.Top)}" X2="{Binding ElementName=myThumb2,Path=(Canvas.Left)}" Y2="{Binding ElementName=myThumb2,Path=(Canvas.Top)}" Stroke="Black" />
</Canvas>

код позади:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        void onDragDelta(object sender, DragDeltaEventArgs e)
        {
            var i = sender as UIElement;
            if (i != null)
            {
                Canvas.SetLeft(i, Canvas.GetLeft(i) + e.HorizontalChange);
                //Canvas.SetTop(myThumb, Canvas.GetTop(myThumb) + e.VerticalChange);
            }
        }
    }
}

РЕДАКТИРОВАТЬ:

Объяснение: здесь есть два перетаскиваемых круга (хось только) и линия, соединяющая оба.Я создал привязку для свойств X-Num, Y-Num и связал их с присоединенными свойствами Canvas.Top/Left объектов большого пальца (используя привязку ElementName).Это помещает оба конца линии в 0,0 координат каждого объекта.Поэтому я использовал отрицательное поле, чтобы поместить центр круга в 0,0.

Надеюсь, это поможет.

1 голос
/ 23 мая 2011

Вы можете использовать MultiValueConverter , чтобы собрать точки интереса и вернуть точку X или Y при необходимости.

Здесь - это хорошее сообщение в блоге, обсуждающее ихиспользовать.

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