【问题标题】:How to add new item to the x:Array from Window.Resources programmatically如何以编程方式从 Window.Resources 向 x:Array 添加新项目
【发布时间】:2019-04-08 07:46:29
【问题描述】:

我有这个 XAML 代码:

<Window.Resources>
    <x:Array x:Name="arrayXAML" x:Key="WordList" Type="sys:String">
      <sys:String>Abraham</sys:String>
      <sys:String>Xylophonic</sys:String>

      <sys:String>Yistlelotusmoustahoppenfie</sys:String>
      <sys:String>Zoraxboraxjajaja</sys:String>
    </x:Array>
</Window.Resources>

我知道我可以通过c#的这两行来访问这个数组:

Object res1 = this.Resources["WordList"];
wordList = this.FindResource("WordList") as string[];

但是如果我想以编程方式向 x:Array 添加一个新字符串呢?

我尝试过:arrayXAML.Items.Add("hello");,但是当我使用如上所示的“FindResource”时它似乎不起作用。有没有办法向这个数组添加项目?

【问题讨论】:

标签: c# wpf


【解决方案1】:

在 XAML 中,x:ArrayArrayExtension 类表示。

x:ArrayMSDN

在 .NET Framework XAML 服务实现中,处理 此标记扩展由 ArrayExtension 类定义。

重要的是要了解,您拥有/获得/来自您的ResourceDictionary 的不是ArrayExtension,而是string[]
因此arrayXAML 上的运行时更改您不会在ResourceDictionary 中看到。

您不能向string[] 添加新元素,请参阅link,但您可以在ResourceDictionary 中为键WordList 设置新值: p>

var sarr = this.Resources["WordList"] as string[];
var newSarr = new string[sarr.Length+1];
for (int i = 0; i < sarr.Length; i++)
{
    newSarr[i] = sarr[i];
}

newSarr[newSarr.Length-1] = "New string from code behind";          
this.Resources["WordList"] = newSarr;

备注:既然你正在修改资源,那么请使用DynamicResource

<ListBox ItemsSource="{DynamicResource WordList}"/>

【讨论】:

  • @mm8 您不能将元素添加到数组的现有实例。 Resize 方法创建新实例并将元素复制到它。只是没有for 循环。
  • 你错了。见source code
  • 你是绝对正确的。它确实创建了一个副本。我的错。 (+1)
  • @mm8 我承认,这是一个卑鄙的陷阱,仅通过 Array.Resize 更改局部变量。
猜你喜欢
  • 2015-03-06
  • 2012-04-21
  • 2010-11-21
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2011-06-16
  • 2023-03-04
  • 2011-07-19
相关资源
最近更新 更多