好的,我有一个ResourceDictionary定义,我用于下面的WPF应用程序:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="fieldsPanel" TargetType="{x:Type StackPanel}">
<Style.Resources>
<Style TargetType="{x:Type CheckBox}">
<Setter Property="Margin" Value="8 2" />
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="0 2" />
<Setter Property="Width" Value="100" />
</Style>
</Style.Resources>
</Style>
当进入我的Silverlight应用程序时,这个确切的XAML块在错误窗格中显示4个错误(第一个错误出现3次,第二个错误出现一次)
-
标记'Type'在XML命名空间'http://schemas.microsoft.com/winfx/2006/xaml'中不存在
-
属性'Resources'在XML命名空间'http://schemas.microsoft.com/winfx/2006/xaml/presentation'中的类型'Style'上不存在
我可以通过将“{x:Type TypeName}”文本替换为“TypeName”来使第一个错误的所有实例消失 . 但这是解决这个问题的正确方法吗?这只是WPF和Silverlight之间的另一个随机和随意的区别吗?
但我无法弄清楚我在第二次错误中做错了什么 . 谁能给我一些帮助(以及你找到答案的地方)?
EDIT:
如果我知道Google如何使用“Style.Resources”(以便谷歌不会忽略这一点),或者我知道这种类型的构造被称为什么术语,我认为可以为自己解决这个问题 .
EDIT:
事实证明,我试图完成的事情最好用UserControl完成 . 但显然我需要学习一套全新的规则来在Silverlight中制作UserControls .
简而言之,我想要这样的事情:
<CheckBox Click="myClickHandler" Name="myName"/><TextBlock Text="The label for the checkbox" />
...制作成UserControl,我可以使用不同的名称和标签多次实例化 . 所有复选框都将使用相同的单击处理程序 .
如果有人想要发布一些快速的UserControl代码并发布它,我会很感激 . 如果没有(我完全理解不想为其他人做免费工作),我会开始谷歌搜索 .
2 回答
乍一看似乎是解决问题的正确方法,它似乎是WPF和Silverlight之间的“另一个随机和任意差异” . 但是,进行此更改实际上并不会产生有效的代码 .
正如Klay在他最新的编辑中指出的那样,他实际需要做的是生成一个UserControl,其中包含可变部分的依赖属性(Text等) .
这是ResourceDictonary page on MSDN,其中包含有关格式的更多信息 .
不要忘记Silverlight实际上不是WPF的子集 . Microsoft必须完全重写运行Silverlight应用程序的代码,以便运行时只需很少的下载 .
EDIT
您需要的XAML是:
然后,您需要创建一个包含用户控件代码的cs文件:
免责声明 - 我've just put this together from a more complex user control so there'不保证'll work 2611602 . You' ll可能需要调整一下才能让它100%正常工作 .
我不确定我是否会打扰创建新的控件,因为不需要新的功能,在最坏的情况下,如果你真的想以它看起来的方式去城镇,你可能需要为CheckBox提供一个全新的模板 . 但是我怀疑你甚至需要在这种情况下触摸模板 .
Padding
属性最终为默认模板的内部ContentPresenter
的Margin
属性 . 如果必须使标签宽度恰好为100像素,则可以将复选框控件宽度设置为116(复选框本身为16像素) .因此,您可以通过以下方式接近您想要的视觉效果: -
与WPF相比,SL的一个关键区别是您无法在本地覆盖Type的样式 . 您需要将控件的Style属性绑定到资源: -