天道酬勤,学无止境

动态和不可变的 UIElement 数组(Dynamic and Immutable UIElement Arrays)

问题

我有一个包含多个相同大小的CanvasWrapPanel 。 每个Canvas都有一些UIElement (即TextBoxTextBlockButton等)作为子项。 每个Canvas (包括其UIElement子项)的创建和要创建的Canvas的数量都在运行时代码后面(无 XAML)中完成。

最初我做了以下工作:

// declare as class properties, so all function can access them
WrapPanel wp = new WrapPanel();
Canvas[] cv = new Canvas[500];
TextBox[] tb = new TextBox[500];

// A function (e.g. a Button_Click event) that generates multiple Canvas in a WrapPanel
for (int i = 0; i<myInt; i++)
{
cv[i] = new Canvas();
tb[i] = new TextBox();
cv[i].Children.Add(tb[i]);
wp.Children.Add(cv[i]);
}

上面的代码很简单,工作正常 - 直到我在我可以的地方实现添加、减号和销毁按钮

1. Add an additional `Canvas` on a click event
2. Remove the last `Canvas` on a click event
3. Destroy a specific `Canvas` in the `WrapPanel` on a click event (may ba a little cross icon in each `Canvas`)

如果我处理上述 3 个操作的某种组合,我可以轻松创建相同索引的 UIElements 或创建超出最初声明范围的 Canvas。

然而,我查看了List ,每个 Canvas 都有不同的属性(每个 Canvas 也有具有不同属性的 UIElement Children),我无法弄清楚 List 将如何解决它。 我的一种解决方法是为 Canvas 声明一个超大的数组大小(例如Canvas[] cv = new Canvas[99999]但我认为这不是很有效。

另外,如果我使用 List,如何在生成特定 UIElement 后更改它们的属性? 例如,如果我添加 10 个 Canvas 并添加到 List,并且在它们全部生成之后,我需要选择第 5 个 Canvas 并更改一个 TextBox.Text,我如何像在 Array 中那样访问它(即 tb[5].文本 = "你好")?

谁能告诉我一些解决这个问题的方法?

回答1

只是直接翻译如何使用下面的列表来做到这一点。 鉴于您的代码,我不知道您为什么要跟踪列表中的画布和文本框 - 您可以直接访问WrapPanel - 假设您现在确实需要这些单独的集合。

 WrapPanel wp = new WrapPanel();
 List<Canvas> cvList = new List<Canvas>();
 List<TextBox> tbList = new List<TextBox>();

 public void Init()
{

    int myInt = 500;
    // in a function (e.g. a Button_Click event) to generate the multiple Canvas in a WrapPanel
    for (int i = 0; i < myInt; i++)
    {
        Canvas cv = new Canvas();
        TextBox tb = new TextBox();
        cv.Children.Add(tb);
        wp.Children.Add(cv);

        cvList.Add(cv);
        tbList.Add(tb);
    }
}


public void AddCanvas()
{
    Canvas cv = new Canvas();
    TextBox tb = new TextBox();
    cv.Children.Add(tb);
    wp.Children.Add(cv);
    cvList.Add(cv);
    tbList.Add(tb);
}

public void RemoveCanvas()
{
        wp.Children.RemoveAt(wp.Children.Count-1);
        cvList.RemoveAt(cvList.Count - 1);
        tbList.RemoveAt(cvList.Count - 1);
}

编辑添加评论:

例如,如果我添加了 10 个 Canvas,并且在它们全部生成之后,我需要选择第 5 个 Canvas 并更改一个 TextBox.Text,我如何像在 Array 中那样访问它(即 tb[5].Text = "Hello ”)?

您可以直接访问孩子。 您知道您只向WrapPanel添加了Canvas元素。 所以你可以这样做(wp 又是WrapPanel ):

TextBox textbox = (wp.Children[5] as Canvas).Children[0] as TextBox;
textbox.Text = "Hello";
回答2

只需直接对WrapPanel的 Children 集合进行操作。

public partial class MainWindow : Window
{        

    public MainWindow()
    {
        InitializeComponent();
        AddCanvasToWrapPanel(this.TestWrapPanel);
        RemoveLastCanvasFromWrapPanel(this.TestWrapPanel);
        AddCanvasToWrapPanel(this.TestWrapPanel);
        DestroyCanvasAtWrapPanelIndex(this.TestWrapPanel, 0);

    }

    private void AddCanvasToWrapPanel(WrapPanel wp)
    {
        TextBox t = new TextBox();
        Canvas c = new Canvas();
        c.Children.Add(t);
        wp.Children.Add(c);
    }

    private void RemoveLastCanvasFromWrapPanel(WrapPanel wp)
    {
        wp.Children.RemoveAt(wp.Children.Count - 1);
    }

    private void DestroyCanvasAtWrapPanelIndex(WrapPanel wp, int index)
    {
        wp.Children.RemoveAt(index);
    }


}
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Dynamic and Immutable UIElement Arrays
    I have a WrapPanel that contains multiple Canvas of the same size. Each Canvas has some UIElements (i.e. TextBox, TextBlock, Buttons etc) as children. The creation of each Canvas (including its UIElement children) and the number of Canvas to be created are all done in run-time code behind (no XAML). Initially I did the following, which works: // declare as class properties, so all function can access them WrapPanel wp = new WrapPanel(); Canvas[] cv = new Canvas[500]; TextBox[] tb = new TextBox[500]; // A function (e.g. a Button_Click event) that generates multiple Canvas in a WrapPanel for
  • 为什么 Scala 标准库中没有不可变数组?(Why no immutable arrays in scala standard library?)
    问题 Scala 有各种各样的不可变序列,如 List、Vector 等。 我很惊讶地发现没有由简单数组支持的不可变索引序列的实现(Vector 对于我的需要来说似乎太复杂了)。 这有设计原因吗? 我在邮件列表上找不到很好的解释。 您是否有与数组具有接近相同性能的不可变索引序列的建议? 我正在考虑使用 scalaz 的 ImmutableArray,但例如它在使用 Scala 主干方面存在一些问题。 谢谢 回答1 您可以将数组转换为序列。 val s: Seq[Int] = Array(1,2,3,4) 该数组将隐式转换为 WrappedArray。 由于类型是 Seq,更新操作将不再可用。 回答2 所以,让我们首先区分接口和类。 接口是一种API设计,而类是这种API的实现。 Scala 中的接口具有相同的名称和不同的包以区分不变性: Seq 、 immutable.Seq 、 mutable.Seq 。 另一方面,这些类通常不共享名称。 List是一个不可变的序列,而ListBuffer是一个可变的序列。 也有例外,比如HashSet ,但这只是实现方面的巧合。 现在, Array不是 Scala 集合的一部分,它是一个 Java 类,但它的包装器WrappedArray清楚地显示了它将出现的位置:作为一个可变类。 WrappedArray实现的接口是IndexedSeq
  • 如何创建包含面板的动态网格(How to create a dynamic grid containing panels)
    问题 我需要动态创建一个具有 3 列的 WPF 网格,行数将取决于我需要的面板数量。 第一个面板将在网格位置 0,0 下一个在 0,1 -> 0,2 -> 1,0 -> 1,1 等等。所以如果我需要 20 个面板,网格将有 3 列和 7 行. 网格应该填满整个窗口 每个面板上都应该有一个标题和一个进度条。 我想我会将我的面板作为单独的用户控件 我从 WPF 开始,所以任何帮助都会很棒 非常感谢 回答1 据我所知,您必须在代码隐藏中执行此操作。 您只需将所需的单元格除以 3 并向上取整。 从网格派生控件。 为单元格编号创建自定义附加属性。 然后覆盖 MeasureOverride,并按四舍五入的行数设置网格行定义。 然后在每个项目上设置 grid.row 和 grid.column 以对应于您从控件读取的单元格编号。 然后调用默认的grid.measureoverride。 public class ArrangeGrid : Grid { public ArrangeGrid() { ColumnDefinitions.Add(new ColumnDefinition()); ColumnDefinitions.Add(new ColumnDefinition()); ColumnDefinitions.Add(new ColumnDefinition()); } public
  • 关于不可变列表(由Arrays.asList()创建)(Regarding immutable List (created by Arrays.asList()))
    问题 当我们使用java.util.Arrays.asList()从数组创建列表时,该列表是不可变的。 我很好奇,当List (或Set或Map )的基本目的是具有动态大小并能够随意添加和删除元素时,为什么我们要创建一个不可变的列表。 当我们需要固定大小的数据结构时,我们使用数组,当我们需要动态数据结构时,我们使用List或Set或Map等。那么拥有不可变列表的目的是什么? 我在做作业时遇到了这个问题。 回答1 当我们使用java.util.Arrays.asList()从数组创建列表时,该列表是可变的。 是和否:可以通过调用以下列表来修改列表 list.set(index, element); 但是该列表可能没有结构上的修改。 这意味着不可能将元素添加到列表中或从列表中删除元素。 原因很简单,因为列表仍受数组支持,并且数组的大小可能不会更改。 当我们需要固定大小的可变集合时,我们就选择数组 这就是这里的关键点:数组不是Collection。 Arrays.asList方法主要充当“数组世界”和“集合世界”之间的“桥梁”。 Arrays.asList方法允许您例如将数据传递给需要Collection的方法: // A method that expects a collection: void process(List<String> strings) { ... } void
  • 什么是可变类。 我们如何在 C# 中创建可变和不可变的类(What are mutable Classes. How can we create a mutable and immutable class in C#)
    问题 我在 CMMI 5 级公司面试中被问到如何在 C# 中创建可变和不可变类。 我听说过 mutable 和 immutable 这意味着可以改变和不能改变,比如String和StringBuilder 。 但是,我不知道如何创建可变类和不可变类。 为此,我们有 String 和 String builder。 但是在创建一个的时候,我被迫在网上搜索了这个,但找不到任何有用的东西,所以想到这里问。 但是,我尝试通过在类中定义一个属性并在其 Getter 上创建它来创建它,我创建了一个新的字符串对象来复制它。 但没有成功理解。 另外,我已经提到在 stackoverflow 中已经提出了一个关于不可变和可变的问题。 但是,我的问题是不同的。 我想知道我是否想创建一个可变类,那么除了使用 String 或其他可变类之外,我将如何使用它。 回答1 更新: 截至 2020 年末,用于 .NET 5.0 的 C# 9.0 已发布,它支持不可变记录类型(支持复制构造函数,并使用with运算符轻松创建具有新属性值的新实例)。 原始答案,在 C# 9.0(和 8.0)发布之前编写: C# 没有 C++ 提供的const正确性支持级别(忽略代码协定),但它仍然提供readonly修饰符(以及 C# 6.0 中真正的只读自动属性),这有帮助。 C# 也缺乏对 Record 类型的语法支持,不幸的是
  • 数据类型
    简介: 可变数据类型和不可变数据类型, 列表,元祖,字符串,集合 1. 可变数据类型和不可变数据类型有哪些 可变数据类型 List(列表), set(集合), dict(字典) 不可变数据类型 number(数字), str(字符串), tuple(元祖), frozenset(不可变集合) 2. 列表和元祖之间的区别 2.1. 主要区别: 列表可变, 数据可以动态变化, 元祖不可变, 大小固定数据量大的时候进行操作, 元祖明显优于列表 2.2. 元祖用于存储**异构(heterogeneous)数据**, 也就是具有不同意义的数据. 列表一般用于存储**同构(homogenous)数据**, 同构数据就是具有相同意义的数据 2.3. 元祖具有结构, 列表具有顺序 3.字典的底层(详细) 1. 字典是Python中最通用的数据结构之一, 可以通过键值对{key: value}来添加和获取数据 2. CPython使用伪随机探测(pseudo-random probing)的散列表(hashtable)作为字典的底层数据结构, 由于这个实现细节, 只有可哈希的对象才能作为字典的键 PS: 可变和不可变数据类型请参考上面 3. PY中所有不可变的内置类型都是可哈希的, 可变类型(列表, 字典, 集合)是不可哈希的, 因此不能作为字典的键 4. 字典的三个基本操作(添加, 获取, 删除
  • 可变长度数组VLA(静态绑定或动态)(variable length arrays VLA (static binding or dynamic))
    问题 自从我使用基本数组在基本编译器中编程以来已经有很长时间了,但是最近我看到了这样的数组声明: int y; cin>>y; int z[y]; 旧版本的编译器曾经给出错误“数组的存储大小不是恒定的”。 然后我发现了C99中可变大小的数组。 我不知道他们在内部如何工作。 这会使数组动态化吗? 这个内存分配在堆上吗? 绑定仍然是静态完成的吗? 如果是这样的话。 回答1 这会使数组动态化吗? 这取决于您如何定义“动态”。 VLA当然不能增长或缩小,换句话说,一旦创建就不能更改其大小。 但是,从某种意义上说,它的长度在编译时是未知的,因此它是动态的。 这个内存分配在堆上吗? 如何为VLA分配内存是特定于实现的。 一般来说,VLA的内存是从调用方的堆栈帧中的空间分配的。 然后,在定义了VLA的函数返回其调用者时,或者VLA超出范围时,它将自动释放。 VLA的最接近亲戚是alloca()函数,至少在C语言中,几乎可以认为它具有相同的作用。假设编译器以与alloca()相同的方式实现VLA,则可以想到这两个数组与C语言在技术上相同: int *a = alloca(sizeof(int) * N); int b[N]; 但是,VLA具有更紧凑和方便的语法。 但最重要的是,VLA本质上具有自动存储期限,并为编译器提供了更大的自由度来决定是在离开声明的作用域时还是从函数返回时销毁/释放数组。
  • java中的可变和不可变字符串有什么区别(What is difference between mutable and immutable String in java)
    问题 据我所知, 可变字符串可以更改,而不变字符串则不能更改。 在这里,我想像这样更改String的值, String str="Good"; str=str+" Morning"; 而另一种方式是 StringBuffer str= new StringBuffer("Good"); str.append(" Morning"); 在这两种情况下,我都试图更改str的值。 谁能告诉我,两种情况的区别是什么,让我清楚地看到可变和不可变的对象。 回答1 情况1: String str = "Good"; str = str + " Morning"; 在上面的代码中,您将创建3个String对象。 “好”它将进入字符串池。 “早晨”也进入字符串池。 通过合并“ Good”和“ Morning”创建的“ Good Morning”。 这个家伙走在堆上。 注意:字符串始终是不可变的。 没有可变的String之类的东西。 str只是一个参考,最终指向“早安”。 您实际上不是在处理1对象。 您有3不同的String对象。 情况2: StringBuffer str = new StringBuffer("Good"); str.append(" Morning"); StringBuffer包含一个字符数组。 这是不相同的String 。 上面的代码将字符添加到现有数组。 实际上,
  • Java中的可变长度(动态)数组(Variable length (Dynamic) Arrays in Java)
    问题 我想知道如何初始化整数数组,以便其大小和值在程序执行过程中发生变化,有什么建议吗? 回答1 是的:使用ArrayList。 在Java中,“普通”数组是固定大小的。 您必须给它们一个尺寸,并且不能扩展或收缩它们。 要更改大小,您必须创建一个新数组并复制所需的数据-这样效率低下,给您带来痛苦。 幸运的是,有各种各样的内置类可以实现通用的数据结构以及其他有用的工具。 您将需要检查Java 6 API的完整列表。 一个警告:ArrayList只能保存对象(例如Integers),而不能保存原语(例如ints)。 在大多数情况下,自动装箱/自动拆箱将为您静默处理,但根据您的操作,您可能会得到一些奇怪的行为。 回答2 Java中的数组大小固定。 您需要的是一个ArrayList,它是Java中许多非常有价值的Collections之一。 代替 Integer[] ints = new Integer[x] 你用 List<Integer> ints = new ArrayList<Integer>(); 然后,要更改列表,可以在适当的Javadocs中找到ints.add(y)和ints.remove(z)以及许多其他方便的方法。 我强烈建议研究Java中可用的Collections类,因为它们非常强大,并为您提供了许多内置功能,而Java新手往往会尝试不必要地重写自身。 回答3
  • Scala 动态多维可变数组,如数据结构(scala dynamic multi dimensional mutable arrays like datastructures)
    问题 有没有办法在 Scala 中构建动态多维数组? 我知道 Scala 中的数组必须按其大小和维度进行初始化,所以我不想要那样。 数据结构应该是动态的。 我试图用列表中的列表来构建它,但我以某种方式迷失了自己。 有很多不同的类型,也许我只是没有找到合适的。 所以请把我推向正确的方向。 回答1 如果你想做类似的事情 a(5) = // 一些计算的结果 那么你需要使用可变集合层次结构中的一些东西。 我建议ArrayBuffer 。 scala> import scala.collection.mutable.ArrayBuffer import scala.collection.mutable.ArrayBuffer scala> val a = ArrayBuffer.fill(3,3)(0) a: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]] = ArrayBuffer(ArrayBuffer(0, 0, 0), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 0, 0)) scala> a(2)(1) = 4 scala> a(0) = ArrayBuffer(1,2,3) scala> a res2: scala.collection
  • 来自 UIElement 的 WPF 屏幕截图 JPG 与 C#(WPF Screenshot JPG from UIElement with C#)
    问题 我正在尝试从我的 WPF 应用程序的一部分创建 JPG。 就像截图一样,只有单个UIElement s。 我从这里开始:http://www.grumpydev.com/2009/01/03/taking-wpf-screenshots/ 我正在使用他的扩展方法,它本质上允许您使用UIElement.GetJpgImage()获取 byte[] 。 然后可以使用文件流将其写入 JPG 图像。 如果我制作整个窗口的 JPG,它看起来就好了! 然而,这并不理想,因为它只是捕捉用户所看到的。 由于滚动查看器或其父级动画为小尺寸而不可见的内容将不会显示。 如果我拍摄一个用于布局的网格的“屏幕截图”:替代文本 http://img697.imageshack.us/img697/4233/fullscreenshot2.jpg 我得到了黑色背景的废话。 我不想要那个。 此外,如果我使用动画折叠了此网格的高度,我将一无所获。 这些实际上是模板化的复选框,它们上面应该有黑色文本,网格的背景应该是白色。 这是其他人编写的用于返回写入文件流的 byte[] 数组的代码: public static byte[] GetJpgImage(this UIElement source, double scale, int quality) { double actualHeight = source
  • 动态添加的 DataTemplate - 找不到用于转换器的静态资源(Dynamically added DataTemplate - StaticResource for Converter can't be found)
    问题 我正在使用以下代码向我的 GridView 动态添加列: public void AddGridViewColumns() { GridView view = (GridView)_myListView.View; GridViewColumn column = BuildGridViewColumn(1); view.Columns.Add(column); } public virtual GridViewColumn BuildGridViewColumn(int blockIndex) { string templateXaml = string.Format( @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" xmlns:local=""clr-namespace:Pse.MyTest;assembly=MyTest""> <DataTemplate.Resources> <local:BlockToBrushConverter x:Key=""_blockToBrushConverter"" /> </DataTemplate
  • UI的并行生成(Parallel Generation of UI)
    问题 我们有一个WPF应用程序,它的ListBox带有一个带有缓存的VirtualizingStackPanel。 不是因为它包含大量元素(通常少于20个,在极端情况下可能多达100个或更多),而是因为元素需要花费时间才能生成。 元素实际上是UIElement对象。 因此,应用程序需要动态生成UIElement。 问题是,即使虚拟化似乎可以正常工作,应用程序仍然响应缓慢,并且这是概念验证解决方案中“噪声”最小的解决方案。 因此,我们认为由于主要问题是我们动态生成复杂的UIElement对象,因此我们需要并行执行此操作,即线程外执行。 但是我们收到一个错误,该代码需要在STA线程上运行: 调用线程必须是STA,因为许多UI组件都需要STA。 这是否意味着我们不能在WPF主UI线程之外的其他线程上生成UI(UIElement对象)? 这是我们概念验证解决方案的相关代码片段: public class Person : ObservableBase { // ... UIElement _UI; public UIElement UI { get { if (_UI == null) { ParallelGenerateUI(); } return _UI; } } private void ParallelGenerateUI() { var scheduler =
  • wpf 固定文档动态数据(wpf fixeddocument dynamic data)
    问题 我正在创建FixedDocument并向其动态添加页面。 public partial class Window1 : Window { FixedDocument fd = new FixedDocument(); TextBlock page1Text = new TextBlock(); public Window1() { InitializeComponent(); } private void Print_Click(object sender, RoutedEventArgs e) { PrintDialog pd = new PrintDialog(); fd.DocumentPaginator.PageSize = new Size(pd.PrintableAreaWidth, pd.PrintableAreaHeight); for (int i = 0; i <= 5; i++) { FixedPage page1 = new FixedPage(); page1.Width = fd.DocumentPaginator.PageSize.Width; page1.Height = fd.DocumentPaginator.PageSize.Height; pages(); page1.Children.Add(page1Text)
  • 使用动态数组的带有 Mustache 的动态表(Dynamic tables with Mustache using dynamic arrays)
    问题 我想知道对于以下问题,我当前的解决方案是否有更优雅的解决方案 问题:鉴于以下条件,使用 Mustache 从动态数组生成动态表: 总列数未知只有一两个列名是已知的,必须有条件地呈现不能使用辅助函数数据仅以数组形式提供。 不是模型类 具有可变列数的典型数据集,其中 ID 是唯一知道始终提供的列: [id*] [Col-1] [Col-2] [Col-3] ...(more) 1 'Foo' 'Bar' 'Baz' ...(more) 2 'Foo' 'Bar' 'Baz' ...(more) 3 'Foo' 'Bar' 'Baz' ...(more) ... (more) 当前解决方案:将可变键名与常量键名混合在下面的示例中,可变键基于从数据源动态提供的各种列名,它们是 ("id"; "name"; "legal_name"; "email"; "signon_email"; "editable") 并且常量键名是 "field" 样本数组: array (size=6) 0 => array (size=2) 'id' => string '10' (length=2) 'field' => string 'id' (length=2) 1 => array (size=2) 'value' => string 'J. Doe' (length=8) 'field' =>
  • 奇怪的 C 代码 - 动态数组?(Strange C code - dynamic arrays?)
    问题 我从未知来源复制了一些代码: int Len=0; printf("Please input the length of vector"); scanf("%d",&Len); float x[Len],y[Len],sig[Len]; 现在通常我相信在运行时不能用变量初始化数组。 但是,据称这确实可以编译。 问题是我又不知道编译器。 是否有合法的 C 变体? 我使用的编译器 IAR C 不喜欢它。 我还看到从 1 而不是 0 索引的数组,这表明它最初是从 Pascal 之类的东西转换而来的。 有什么意见吗? 回答1 现在通常我相信在运行时不能用变量初始化数组。 在 C99 标准之前确实如此。 它在 C++ 中也是非法的(尽管一些编译器,例如 gcc,将其作为扩展提供)。 是否有合法的 C 变体? 任何 C99 编译器都可以。 我还看到从 1 而不是 0 索引的数组 这也可以,只要您可以分配额外的元素,并且不使用索引为零的元素。 注意:由于访问数组末尾的元素是未定义的行为,因此无效的程序可能会在您的测试运行中工作并产生所需的结果。 如果您怀疑某些数组索引可能偏离 1,请考虑在内存分析器(例如 valgrind)下运行您的程序,以查看程序是否存在与无效内存访问相关的隐藏错误。 回答2 这是 C99 中引入的一个特性,称为 VLA(可变长度数组)。 这些数组也从 0 开始索引
  • .NET中可能有不可变的数组吗?(Are immutable arrays possible in .NET?)
    问题 是否有可能以某种方式将System.Array标记为不可变。 当放在公共获取/私有集后面时,由于需要重新分配和重新分配,因此不能将它们添加到其中,但是消费者仍然可以设置他们希望的任何下标: public class Immy { public string[] { get; private set; } } 我以为readonly关键字可以解决问题,但是没有这种运气。 回答1 ReadOnlyCollection <T>可能是您要寻找的。 它没有Add()方法。 回答2 框架设计指南建议返回数组的副本。 这样,消费者就无法更改数组中的项目。 // bad code // could still do Path.InvalidPathChars[0] = 'A'; public sealed class Path { public static readonly char[] InvalidPathChars = { '\"', '<', '>', '|' }; } 这些更好: public static ReadOnlyCollection<char> GetInvalidPathChars(){ return Array.AsReadOnly(InvalidPathChars); } public static char[] GetInvalidPathChars(){
  • 不可变对象和有效不可变对象之间的区别?(Different between immutable and effectively immutable objects?)
    问题 这是 Java Concurrency in Practice 中的一句话 共享只读对象包括不可变对象和有效不可变对象。 不可变对象和有效不可变对象之间有什么区别? 回答1 不可扩展且其字段都是final且本身不可变的类的实例是不可变的。 由于其方法的细节而不能改变其字段的类的实例实际上是不可变的。 例如: final class C { final boolean canChange; private int x; C(boolean canChange) { this.canChange = canChange; } public void setX(int newX) { if (canChange) { this.x = newX; } else { throw new IllegalStateException(); } } } C一些实例实际上是不可变的,而另一些则不是。 另一个例子是零长度数组。 它们实际上是不可变的,即使它们的包含类不能证明是不可变的,因为它们中没有可以更改的元素。 Joe-E 使用验证器来证明某些类只允许不可变实例。 任何标有 Immutable 标记接口的东西都会被检查,并且某些类,比如String (实际上是不可变的,因为它的char[]不会转义)被视为不可变的。 Joe-E:面向安全的 Java 子集说 由 Joe-E 库定义的
  • 如何通过用户的XAML向UserControl动态添加控件?(How to add controls dynamically to a UserControl through user's XAML?)
    问题 我想创建一个包含TextBlock和StackPanel的用户控件,该控件将允许用户在XAML中将自己的控件动态添加到该用户控件中。 这是我的UserControl的示例XAML: <UserControl x:Class="A1UserControlLibrary.UserControlStackPanel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="200" d:DesignWidth="300"> <StackPanel> <TextBlock Text="I want the user to be able to add any number of controls to the StackPanel below this TextBlock."
  • 制作类的动态数组的独立副本(Making independent copies of Dynamic Arrays of classes)
    问题 我想创建涉及类(不是记录)的 DynamicArrays 的独立副本。 我正在使用 Delphi XE5。 在下面的示例代码中,在完成所有分配后,动态数组的所有副本都包含相同的值。 在“复制”中已经解释过,因为涉及类,所以它是预期的行为,不会创建动态数组的独立副本。 我遇到的问题是我无法避免使用类。 Delphi 通过读入 WSDL 生成类型定义。 这是一个巨大的文件,里面有将近 5000 行。 尝试详细修改类型定义是不可取的,并且会打开另一个蠕虫罐。 TYPE TX = class(TRemotable) private <..vars and functions..> published <..properties..> end; TArray_Of_TX = array of TX; TDATA_RECORD = class(TRemotable) private <..vars and functions..> public destructor Destroy; override; published <..other properties..> property Y: TArray_Of_TX Index (IS_OPTN or IS_UNBD) read FY write SetY stored ABooleanVariable; end; VAR X