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