C# 为什么x:Array元素会导致忽略它后面的任何x:Shared属性?

C# 为什么x:Array元素会导致忽略它后面的任何x:Shared属性?,c#,wpf,xaml,C#,Wpf,Xaml,我怀疑有XAML编译器和/或WPF错误,但我想确保我在这里没有做错什么(除了信任XAML编译器和/或WPF,即:)) 对于将重现问题的最小WPF程序,请考虑以下XAML: <Window x:Class="TestxSharedMenuItem.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.micros

我怀疑有XAML编译器和/或WPF错误,但我想确保我在这里没有做错什么(除了信任XAML编译器和/或WPF,即:))

对于将重现问题的最小WPF程序,请考虑以下XAML:

<Window x:Class="TestxSharedMenuItem.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:s="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>
    <x:Array x:Key="menuItemValues1" Type="{x:Type s:String}">
      <s:String>value #1</s:String>
      <s:String>value #2</s:String>
      <s:String>value #3</s:String>
    </x:Array>
    <MenuItem x:Key="menuItem1" x:Shared="False"
              ItemsSource="{StaticResource menuItemValues1}"
              Header="Shared menu item"/>
  </Window.Resources>
  <StackPanel>
    <Menu HorizontalAlignment="Left" VerticalAlignment="Top">
      <StaticResource ResourceKey="menuItem1"/>
      <StaticResource ResourceKey="menuItem1"/>
    </Menu>
  </StackPanel>
</Window>
  • 在代码隐藏中定义数组(例如,作为C#
    静态只读
    字段而不是XAML)。例如:
  • 公共静态只读字符串[]MenuItemValues={“值#1”、“值#2”、“值#3”};
    
    例如:

    
    
  • 使用不同的标记声明集合。例如,使用
    ArrayList
    或继承
    List
    的非泛型类(因为XAML和泛型不能很好地配合使用)

  • XAML在我看来很好。我做错什么了吗?我是否违反了XAML编译器和/或WPF强加的一些我不知道的“按设计”规则

    这不是我第一次遇到
    x:Array
    标记扩展导致问题的问题(请参见和),但我想检查一下,以确保我没有忽略这里的内容,并且我编写的XAML实际上应该如我所期望的那样工作


    附录:

    现在,由于没有一个解释我错误地编写了XAML的答案,我将假设我认为这是XAML编译器和/或WPF中的一个错误,这是正确的。我已在Microsoft Connect网站上提交了一份错误报告,以防其他人遇到此问题,并希望插话:

    明确写入

    
    值#1
    值#2
    价值#3
    
    我有一个非常类似的问题(事实上,完全相同,只有UserControl)。当我尝试上述解决方法时,我感到绝望:),但它奏效了

    我刚刚用您的示例代码进行了尝试,使用显式的
    我可以使用它,没有它就不行了。

    嗨,Peter,另一个解决方法是使用ArrayList而不是Array。看,我觉得这是一只虫子。如果用不同的集合类型替换
    x:Array
    (例如继承
    List
    的集合)解决了这个问题,那么我肯定会称之为bug。@塔特:谢谢……是的,
    ArrayList
    或继承
    List
    的类(如卢卡斯所建议的)也是一个有用的解决方法。(顺便说一句,我取消了标记编辑,因为虽然这些标记有辅助连接,但这个问题实际上不是关于可重用性或
    MenuItem
    对象……事实上,问题发生在尝试设置
    x:Shared=“False”
    元素的任何类型的元素上,而不仅仅是
    MenuItem
    元素)@Lucas:谢谢……我倾向于同意你的看法,是的,使用不同的收藏类型也可以。我会改天再问这个问题,以防其他人有更多的意见,然后继续发布bug来连接(我会在问题中包含一个链接以供参考)。好的,Peter和@Lucas,我在这里创建了一个问题:虽然这篇文章没有真正回答我问的问题,但我认为这是我将要得到的最接近的问题。这种行为很可能是一个bug(微软从未对此发表过评论,但似乎是),而这种变通方法可能是让代码正常工作的最佳方式。因此,我将继续接受这一点(最后),以避免混乱的“未回答的问题”搜索,并相信作者是唯一有有用答案(或任何答案)的受访者。
    <Window x:Class="TestxSharedMenuItem.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:s="clr-namespace:System;assembly=mscorlib"
            Title="MainWindow" Height="350" Width="525">
      <Window.Resources>
        <ResourceDictionary> <!-- modified here -->
          <x:Array x:Key="menuItemValues1" Type="{x:Type s:String}">
            <s:String>value #1</s:String>
            <s:String>value #2</s:String>
            <s:String>value #3</s:String>
          </x:Array>
          <MenuItem x:Key="menuItem1" x:Shared="False"
                    ItemsSource="{StaticResource menuItemValues1}"
                    Header="Shared menu item"/>
        </ResourceDictionary> <!-- modified here -->
      </Window.Resources>
      <StackPanel>
        <Menu HorizontalAlignment="Left" VerticalAlignment="Top">
          <StaticResource ResourceKey="menuItem1"/>
          <StaticResource ResourceKey="menuItem1"/>
        </Menu>
      </StackPanel>
    </Window>