如何在wpf中传递和设置值到Usercontrol

时间:2015-09-25 05:25:25

标签: c# asp.net wpf xaml user-controls

如何将值传递并设置为Usercontrol。

这里有两个关于WPF项目的问题。

概述: 在这个项目中,我尝试将Usercontrol用作画布上的资源,并通过LineGeometry将它们相互连接。 ' MyThumb' class i用于控制可拖动和控制设置值。 我正在使用覆盖的OnApplyTemplate'在Usercontrol上传递值的方法。要使用' Template.FindName'来设置值。这里它返回null。 现在的问题是如何在usercontrol'上设置值。在下面的代码中:

另一个问题与线条颜色有关。在项目中,我使用LineGeometry在用户控件之间显示行但不能更改行颜色..想要设置不同颜色的不同行。 这里的问题是如何改变现有LineGeometry的颜色。

请查看我使用的代码:

Mythumb.cs

 public class MyThumb : Thumb
{
    #region Properties
    public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(MyThumb), new UIPropertyMetadata(""));
    public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(string), typeof(MyThumb), new UIPropertyMetadata(""));

    // This property will hanlde the content of the textblock element taken from control template
    public string Title
    {
        get { return (string)GetValue(TitleProperty); }
        set { SetValue(TitleProperty, value); }
    }

    // This property will handle the content of the image element taken from control template
    public string ImageSource
    {
        get { return (string)GetValue(ImageSourceProperty); }
        set { SetValue(ImageSourceProperty, value); }
    }

    public Point MyLocation
    {
        get
        {
            Point nm = new Point(Canvas.GetLeft(this), Canvas.GetTop(this));
            return nm;
        }

    }

    public List<LineGeometry> EndLines { get; private set; }
    public List<LineGeometry> StartLines { get; private set; } 
    #endregion

    #region Constructors
    public MyThumb()
        : base()
    {
        StartLines = new List<LineGeometry>();
        EndLines = new List<LineGeometry>();
    }

    public MyThumb(string title, string imageSource, Point position)
        : this()
    {
//Setting ControlTemplate as Usercontrol 'ContactNode'
        ControlTemplate templatex = new ControlTemplate();
        var fec = new FrameworkElementFactory(typeof(ContactNode));
        templatex.VisualTree = fec;

        this.Template = templatex;
        this.Title = (title != null) ? title : string.Empty;
        this.ImageSource = (imageSource != null) ? imageSource : string.Empty;
        this.SetPosition(position);
    }

    public MyThumb( string title, string imageSource, Point position, DragDeltaEventHandler dragDelta)
        : this(title, imageSource, position)
    {
        this.DragDelta += dragDelta;
    }
    #endregion

    // Helper method for setting the position of our thumb
    public void SetPosition(Point value)
    {
        Canvas.SetLeft(this, value.X);
        Canvas.SetTop(this, value.Y);
    }

    #region Linking logic
    // This method establishes a link between current thumb and specified thumb.
    // Returns a line geometry with updated positions to be processed outside.
    public LineGeometry LinkTo(MyThumb target)
    {
        // Create new line geometry
        LineGeometry line = new LineGeometry();
        // Save as starting line for current thumb
        this.StartLines.Add(line);
        // Save as ending line for target thumb
        target.EndLines.Add(line);
        // Ensure both tumbs the latest layout
        this.UpdateLayout();
        target.UpdateLayout();
        // Update line position
        line.StartPoint = new Point(Canvas.GetLeft(this) + this.ActualWidth / 2, Canvas.GetTop(this) + this.ActualHeight / 2);
        line.EndPoint = new Point(Canvas.GetLeft(target) + target.ActualWidth / 2, Canvas.GetTop(target) + target.ActualHeight / 2);
        // return line for further processing
        return line;
    }

    // This method establishes a link between current thumb and target thumb using a predefined line geometry
    // Note: this is commonly to be used for drawing links with mouse when the line object is predefined outside this class
    public bool LinkTo(MyThumb target, LineGeometry line)
    {
        // Save as starting line for current thumb
        this.StartLines.Add(line);
        // Save as ending line for target thumb
        target.EndLines.Add(line);
        // Ensure both tumbs the latest layout
        this.UpdateLayout();
        target.UpdateLayout();
        // Update line position
        line.StartPoint = new Point(Canvas.GetLeft(this) + this.ActualWidth / 2, Canvas.GetTop(this) + this.ActualHeight / 2);
        line.EndPoint = new Point(Canvas.GetLeft(target) + target.ActualWidth / 2, Canvas.GetTop(target) + target.ActualHeight / 2);
        return true;
    } 
    #endregion

    // This method updates all the starting and ending lines assigned for the given thumb 
    // according to the latest known thumb position on the canvas
    public void UpdateLinks()
    {
        double left = Canvas.GetLeft(this);
        double top = Canvas.GetTop(this);

        for (int i = 0; i < this.StartLines.Count; i++)
            this.StartLines[i].StartPoint = new Point(left + this.ActualWidth / 2, top + this.ActualHeight / 2);

        for (int i = 0; i < this.EndLines.Count; i++)
            this.EndLines[i].EndPoint = new Point(left + this.ActualWidth / 2, top + this.ActualHeight / 2);
    }

    // Upon applying template we apply the "Title" and "ImageSource" properties to the template elements.
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        // Access the textblock element of template and assign it if Title property defined
        if (this.Title != string.Empty)
        {
            TextBlock txt = this.Template.FindName("tplTextBlock", this) as TextBlock;
            if (txt != null) //getting null here unable to find element..
                txt.Text = Title;
        }

        // Access the image element of our custom template and assign it if ImageSource property defined
        if (this.ImageSource != string.Empty)
        {
            Image img = this.Template.FindName("tplImage", this) as Image;
            if (img != null)
                img.Source = new BitmapImage(new Uri(this.ImageSource, UriKind.Relative));
        }
    }
}

Window1.xaml.cs

public partial class Window1 : Window
{
    // flag for enabling "New thumb" mode
    bool isAddNewAction = false;
    // flag for enabling "New link" mode
    bool isAddNewLink = false;
    // flag that indicates that the link drawing with a mouse started
    bool isLinkStarted = false;
    // variable to hold the thumb drawing started from
    MyThumb linkedThumb;
    // Line drawn by the mouse before connection established
    LineGeometry link;

    public Window1()
    {
        InitializeComponent();            
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Point pp = new Point(myCanvas.ActualWidth/2,myCanvas.ActualHeight/2);
        AdNewNode(pp, "ACTION", "/Images/gear_connection.png");

        this.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(Window1_PreviewMouseLeftButtonDown);
        this.PreviewMouseMove += new MouseEventHandler(Window1_PreviewMouseMove);
        this.PreviewMouseLeftButtonUp += new MouseButtonEventHandler(Window1_PreviewMouseLeftButtonUp);

    }

    // Event hanlder for dragging functionality support
    private void onDragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
    {
        // Exit dragging operation during adding new link
        if (isAddNewLink) return;

        MyThumb thumb = e.Source as MyThumb;

        Canvas.SetLeft(thumb, Canvas.GetLeft(thumb) + e.HorizontalChange);
        Canvas.SetTop(thumb, Canvas.GetTop(thumb) + e.VerticalChange);

        // Update links' layouts for active thumb
        thumb.UpdateLinks();
    }

    // Event handler for creating new thumb element by left mouse click
    // and visually connecting it to the myThumb2 element

    void AdNewNode(Point nPosition,string nTitle, string nImage)
    {
        MyThumb newThumb = new MyThumb(
                nTitle,
                nImage,     
                nPosition,
                onDragDelta);
        myCanvas.Children.Add(newThumb);
    }

    void Window1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        // If adding new action...
        if (isAddNewAction)
        {

            AdNewNode(e.GetPosition(this), "ACTION", "/Images/gear_connection.png");


            // resume common layout for application
            isAddNewAction = false;                
            Mouse.OverrideCursor = null;
            btnNewAction.IsEnabled = btnNewLink.IsEnabled = true;
            e.Handled = true;
        }

        // Is adding new link and a thumb object is clicked...
        if (isAddNewLink && e.Source.GetType() == typeof(MyThumb))
        {                
            if (!isLinkStarted)
            {
                if (link == null || link.EndPoint != link.StartPoint)
                {
                    Point position = e.GetPosition(this);
                    link = new LineGeometry(position, position);

                    //nodepath=new Path();
                    //nodepath.Stroke = Brushes.Pink;
                    //nodepath.Data = link;   // Here line color is getting change but connectivity getting lost....


                    connectors.Children.Add(link);
                    //myCanvas.Children.Add(nodepath);

                    isLinkStarted = true;
                    linkedThumb = e.Source as MyThumb;
                    e.Handled = true;
                }
            }
        }
    }

    // Handles the mouse move event when dragging/drawing the new connection link
    void Window1_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (isAddNewLink && isLinkStarted)
        {
            // Set the new link end point to current mouse position
            link.EndPoint = e.GetPosition(this);
            e.Handled = true;
        }
    }

    // Handles the mouse up event applying the new connection link or resetting it
    void Window1_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        // If "Add link" mode enabled and line drawing started (line placed to canvas)
        if (isAddNewLink && isLinkStarted)
        {
            // declare the linking state
            bool linked = false;
            // We released the button on MyThumb object
            if (e.Source.GetType() == typeof(MyThumb))
            {
                MyThumb targetThumb = e.Source as MyThumb;
                // define the final endpoint of line
                link.EndPoint = e.GetPosition(this);
                // if any line was drawn (avoid just clicking on the thumb)
                if (link.EndPoint != link.StartPoint && linkedThumb != targetThumb)
                {
                    // establish connection
                    linkedThumb.LinkTo(targetThumb, link);
                    // set linked state to true

                    //nodepath = new Path();
                    //nodepath.Stroke = Brushes.Pink;
                    //nodepath.Data = link;

                    linked = true;
                }
            }
            // if we didn't manage to approve the linking state
            // button is not released on MyThumb object or double-clicking was performed
            if (!linked)
            {
                // remove line from the canvas
                //connectors.Children.Remove(link);
                // clear the link variable
                link = null;
            }

            // exit link drawing mode
            isLinkStarted = isAddNewLink = false;
            // configure GUI
            btnNewAction.IsEnabled = btnNewLink.IsEnabled = true;
            Mouse.OverrideCursor = null;
            e.Handled = true;
        }
        //this.Title = "Links established: " + connectors.Children.Count.ToString();
    }

    // Event handler for enabling new thumb creation by left mouse button click
    private void btnNewAction_Click(object sender, RoutedEventArgs e)
    {            
        isAddNewAction = true;
        Mouse.OverrideCursor = Cursors.SizeAll;
        btnNewAction.IsEnabled = btnNewLink.IsEnabled = false;
    }

    private void btnNewLink_Click(object sender, RoutedEventArgs e)
    {
        isAddNewLink = true;
        Mouse.OverrideCursor = Cursors.Cross;
        btnNewAction.IsEnabled = btnNewLink.IsEnabled = false;
    }
}

请尝试纠正我在此代码中出错的地方。

0 个答案:

没有答案