gpt4 book ai didi

c# - 动态创建 xaml 对象时收到未声明的前缀

转载 作者:行者123 更新时间:2023-11-30 14:18:03 29 4
gpt4 key购买 nike

见鬼,我目前正在尝试在代码中动态创建一些对象。这已经成功到我想要识别元素的地步在这里,我创建了对象(带阴影的椭圆)

public MainPage()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainPage_Loaded);
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
var element = CreateEllipse();
LayoutRoot.Children.Add(element);
}

public Ellipse CreateEllipse()
{
StringBuilder xaml = new StringBuilder();
string ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
xaml.Append("<Ellipse ");
xaml.Append(string.Format("xmlns='{0}'", ns));
xaml.Append(" x:Name='myellipse'"); //causes the exception
xaml.Append(" Margin='50 10 50 10'");
xaml.Append(" Grid.Row='0'");
xaml.Append(" Fill='#FD2424FF'");
xaml.Append(" Stroke='Black' >");
xaml.Append("<Ellipse.Effect>");
xaml.Append("<DropShadowEffect/>");
xaml.Append(" </Ellipse.Effect>");
xaml.Append(" </Ellipse>");
var ellipse = (Ellipse)XamlReader.Load(xaml.ToString());
return ellipse;
}

我想做的是在创建对象后,我希望能够使用 VisualTreeHelper 定位父对象。

public void button1_Click(object sender, RoutedEventArgs e)
{
DependencyObject o = myellipse;
while ((o = VisualTreeHelper.GetParent(o)) != null)
{
textBox1.Text = (o.GetType().ToString());
}
}

任何人都可以指出在这样的场景中引用动态创建的对象的正确方向,或者如何以编程方式正确定义对象的 x:Name 吗?

谢谢,

最佳答案

Can anyone point me in the right direction for referencing a dynamically created object in a scenario like this or how to properly define x:Name for an object programatically?

您不能像这样使用动态生成的类型直接引用“myellipse”。编译器将x:Name 转换为类型在编译时 - 因为您是在运行时加载它,所以它不会存在。

相反,您可以制作一个“myellipse”变量,并让您的动态生成例程设置它:

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
var element = CreateEllipse();
LayoutRoot.Children.Add(element);
}

private Ellipse myEllipse;
public Ellipse CreateEllipse()
{
StringBuilder xaml = new StringBuilder();
string ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
xaml.Append("<Ellipse ");
xaml.Append(string.Format("xmlns='{0}'", ns));
xaml.Append(" Margin='50 10 50 10'");
xaml.Append(" Grid.Row='0'");
xaml.Append(" Fill='#FD2424FF'");
xaml.Append(" Stroke='Black' >");
xaml.Append("<Ellipse.Effect>");
xaml.Append("<DropShadowEffect/>");
xaml.Append(" </Ellipse.Effect>");
xaml.Append(" </Ellipse>");
this.myEllipse = (Ellipse)XamlReader.Load(xaml.ToString());

return this.myEllipse;
}

也就是说,我建议不要使用这样的字符串来构建椭圆。您可以直接创建椭圆类,然后添加效果。在这种情况下,您不需要使用 XamlReader 来解析字符串。

private Ellipse myEllipse; 
public Ellipse CreateEllipse()
{
this.myEllipse = new Ellipse();
this.myEllipse.Effect = new DropShadowEffect();
Grid.SetRow(this.myEllipse, 0);
// Set properties as needed

return this.myEllipse;
}

关于c# - 动态创建 xaml 对象时收到未声明的前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069933/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com