如何在WPF中将“FrameworkElement”转换为“Line Shape”?

时间:2014-02-27 19:06:06

标签: c# wpf canvas

我正在尝试使用“foreach”在“Canvas”上迭代一系列“Line Shapes”。 在“foreach”的主体中,我想更改每个“Line”的“X1”,“Y1”,“X2”,“Y2”坐标。

我在下面创建了一个简单的例子。 下面的一小段XAML和C#代码在画布上创建了3行。

<Window x:Class="TestCase.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow">
    <Canvas Height="500" Width="500" Name="My_Canvas">
       <Line StrokeThickness="10" Stroke="Black" X1="100" Y1="100" X2="200" Y2="100"
             Tag="Line #1"/>
       <Line StrokeThickness="10" Stroke="Black" X1="100" Y1="200" X2="200" Y2="200"
             Tag="Line #2"/>
       <Line StrokeThickness="10" Stroke="Black" X1="100" Y1="300" X2="200" Y2="300"
             Tag="Line #3"/>
    </Canvas>
</Window>

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

namespace TestCase
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            foreach (FrameworkElement Hold_Element in My_Canvas.Children)
            {
                MessageBox.Show("Tag = " + Hold_Element.Tag);

                //(Line)Hold_Element.X1 = (Line)Hold_Element.X1 + 90;           
            }
        }
    }
}

C#代码遍历这些行,并在消息框中正确显示每个“行”的“标记”。

注释掉的行是我想要应用的代码。

我想将每个“Line”的X1坐标向右移动90个单位。 如何使此注释掉的行有效? 我不能让铸件正确... 不知何故,我必须将“FrameworkElement”转换为“Line Shape”并在“Line Shape”上设置“X1”坐标。

谢谢, 吉姆

2 个答案:

答案 0 :(得分:1)

类型转换不正确。在括号中包装对象以访问它的属性(在您的情况下为X1)。

替换

(Line)Hold_Element.X1 = (Line)Hold_Element.X1 + 90;

((Line)Hold_Element).X1 = ((Line)Hold_Element).X1 + 90;

答案 1 :(得分:0)

你基本上是正确的 - 只需要在演员周围添加额外的括号:

((Line)Hold_Element).X1 = ((Line)Hold_Element).X1 + 90;           

或者,请注意您可以使用foreach Linq扩展方法在OfType语句中指定类型:

foreach (Line Hold_Element in My_Canvas.Children)
{
    MessageBox.Show("Tag = " + Hold_Element.Tag.OfType<Line>());
    Hold_Element.X1 = Hold_Element.X1 + 90;           
}

第二种方法更可取,因为它只返回正确类型的元素(因此您不会冒运行时“无效转换”异常的风险)。