C# 为什么x:Array元素会导致忽略它后面的任何x:Shared属性?
我怀疑有XAML编译器和/或WPF错误,但我想确保我在这里没有做错什么(除了信任XAML编译器和/或WPF,即:)) 对于将重现问题的最小WPF程序,请考虑以下XAML: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
<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>
静态只读
字段而不是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>