Wpf 在Silverlight中,所选文本/图像元素周围是否可能有虚线边框?

Wpf 在Silverlight中,所选文本/图像元素周围是否可能有虚线边框?,wpf,image,silverlight,border,frameworkelement,Wpf,Image,Silverlight,Border,Frameworkelement,我有一个在silverlight中开发的图像编辑器,它在一个画布上有多个文本和图像元素,可以拖动等等。我需要用户的反馈,以便在用户单击选定元素时高亮显示该元素,如果单击另一个元素,则高亮显示另一个元素。我想我应该在元素周围画一个虚线,但我不知道这是否可行 下面是我与元素相关的代码- Project.cs namespace ImageEditor.Client.BLL { public class Project : INotifyPropertyChanged { privat

我有一个在silverlight中开发的图像编辑器,它在一个画布上有多个文本和图像元素,可以拖动等等。我需要用户的反馈,以便在用户单击选定元素时高亮显示该元素,如果单击另一个元素,则高亮显示另一个元素。我想我应该在元素周围画一个虚线,但我不知道这是否可行

下面是我与元素相关的代码-

Project.cs

namespace ImageEditor.Client.BLL
{
 public class Project : INotifyPropertyChanged
   {
    private int numberOfElements;

    #region Properties

    private ObservableCollection<FrameworkElement> elements;
    public ObservableCollection<FrameworkElement> Elements
    {
        get { return elements; }
        set
        {
            elements = value;
            NotifyPropertyChanged("Elements");
        }
    }


    private FrameworkElement selectedElement;
    public FrameworkElement SelectedElement
    {
        get { return selectedElement; }
        set
        {
            selectedElement = value;
            NotifyPropertyChanged("SelectedElement");

        }
    }


    private TextBlock selectedTextElement;
    public TextBlock SelectedTextElement
    {
        get { return selectedTextElement; }
        set
        {
            selectedTextElement = value;
            NotifyPropertyChanged("SelectedTextElement");
        }
    }

    private Image selectedImageElement;
    public Image SelectedImageElement
    {
        get { return selectedImageElement; }
        set
        {
            selectedImageElement = value;
            NotifyPropertyChanged("SelectedImageElement");
        }
    }

    #endregion


    #region Methods

    private void AddTextElement(object param)
    {
        TextBlock textBlock = new TextBlock();
        textBlock.Text = "New Text";
        textBlock.Foreground = new SolidColorBrush(Colors.Gray);
        textBlock.FontSize = 25;
        textBlock.FontFamily = new FontFamily("Arial");
        textBlock.Cursor = Cursors.Hand;
        textBlock.Tag = null;

        AddDraggingBehavior(textBlock);
        textBlock.MouseLeftButtonUp += element_MouseLeftButtonUp;

        this.Elements.Add(textBlock);
        numberOfElements++;

        this.SelectedElement = textBlock;
        this.selectedTextElement = textBlock;
    }

    private BitmapImage GetImageFromLocalMachine(out bool? success, out string fileName)
    {
        OpenFileDialog dialog = new OpenFileDialog()
        {
            Filter = "Image Files (*.bmp;*.jpg;*.gif;*.png;)|*.bmp;*.jpg;*.gif;*.png;",
            Multiselect = false
        };

        success = dialog.ShowDialog();
        if (success == true)
        {
            fileName = dialog.File.Name;
            FileStream stream = dialog.File.OpenRead();
            byte[] data;

            BitmapImage imageSource = new BitmapImage();
            using (FileStream fileStream = stream)
            {
                imageSource.SetSource(fileStream);
                data = new byte[fileStream.Length];
                fileStream.Read(data, 0, data.Length);
                fileStream.Flush();
                fileStream.Close();
            }

            return imageSource;
        }
        else
        {
            fileName = string.Empty;
            return new BitmapImage();
        }
    }

    private void AddImageElement(object param)
    {
        bool? gotImage;
        string fileName;
        BitmapImage imageSource = GetImageFromLocalMachine(out gotImage, out fileName);

        if (gotImage == true)
        {
            Image image = new Image();
            image.Name = fileName;
            image.Source = imageSource;
            image.Height = imageSource.PixelHeight;
            image.Width = imageSource.PixelWidth;
            image.MaxHeight = imageSource.PixelHeight;
            image.MaxWidth = imageSource.PixelWidth;
            image.Cursor = Cursors.Hand;
            image.Tag = null;


            AddDraggingBehavior(image);
            image.MouseLeftButtonUp += element_MouseLeftButtonUp;

            this.Elements.Add(image);
            numberOfElements++;

            this.SelectedElement = image;
            this.SelectedImageElement = image;
        }
    }


    private void OrderElements()
    {
        var elList = (from element in this.Elements
                      orderby element.GetValue(Canvas.ZIndexProperty)
                      select element).ToList<FrameworkElement>();

        for (int i = 0; i < elList.Count; i++)
        {
            FrameworkElement fe = elList[i];
            fe.SetValue(Canvas.ZIndexProperty, i);
        }

        this.Elements = new ObservableCollection<FrameworkElement>(elList);
    }

    public void element_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        this.SelectedElement = sender as FrameworkElement;
        if (sender is TextBlock)
        {
            this.SelectedTextElement = sender as TextBlock;
            FadeOut(this.SelectedTextElement);
        }
        else if (sender is Image)
        {
            this.SelectedImageElement = sender as Image;
            FadeOut(this.SelectedImageElement);
        }

    }
    #endregion
它似乎什么也没做,而且也不是我想做的。没有办法直接在框架元素上创建破折号边框吗?

我不知道如何

您可以使用StrokeDashArray来实现所需的效果, 例如:

StrokeDashArray中的第一个数字是短划线的长度 第二个数字是间隙的长度。你可以重复破折号 配对以生成不同的模式

编辑:

要在代码中执行此操作,请创建一个矩形,并将其设置为
StrokeDashArray
属性,如下所示(代码未测试):


我知道strokedasharray的事。我不能在XAML中这样做,因为元素是以编程方式添加的,我需要在单击te元素时以编程方式添加边框,在其他情况下删除te元素时以编程方式添加边框。这种方式可以将元素放在我的图像/文本框架元素上吗?
public static void DashBorder(FrameworkElement元素){element.StrokeDashArray=new DoubleCollection(){2,2};}
它必须是一个形状:它只是告诉我System.Windows.FrameworkElement不包含StrokeDashArray的定义。我尝试了你的代码,得到了相同的结果,即使它是一个矩形。我使用ImageTools意味着我得到了“ImageTools.Rectangle不包含StrokeDashArray的定义。。。。"当我使用您的代码时,您没有对矩形执行任何操作…此外,不,我非常确定您不能直接将虚线边框添加到框架元素。您必须使用允许虚线边框的元素,或者直接使用虚线边框,或者将其作为控件模板的一部分。请注意,
StrokeDashArray
形状上的一个属性对象。
public static void DashBorder(FrameworkElement element)
    {
        Rectangle rect = new Rectangle();
        rect.Stroke = new SolidColorBrush(Colors.Black);
        rect.Width=element.Width;
        rect.Height=element.Height;
        rect.StrokeDashArray = new DoubleCollection() { 2, 2 };

    }
Rectangle rect = new Rectangle();
rect.StrokeThickness = 1;
double[] dashArray = new double[2];
dashArray[0] = 2;
dashArray[1] = 4;
rect.StrokeDashArray = dashArray;