wpf到silverlight xaml问题
好的,我有一个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>
将这个确切的XAML块带入我的Silverlight应用程序时,会在错误窗格中显示4个错误(第一个错误出现3次,第二个错误出现一次)
标签'Type'不存在于XML名称空间'http://schemas.microsoft.com/winfx/2006/xaml'
XML名称空间'http://schemas.microsoft.com/winfx/2006/xaml/presentation'中'Style'类型的属性'Resources'不存在
我可以通过用“TypeName”替换“{x:Type TypeName}”文本来让第一个错误的所有实例消失。 但是,这是解决这个问题的正确方法吗? 这是WPF和Silverlight之间的另一个随意和任意的区别吗?
但我无法弄清楚我在第二个错误中做错了什么。 任何人都可以给我一些帮助(和你找到答案的地方)?
编辑:
如果我知道如何谷歌“Style.Resources”(让谷歌不会忽略这个点),或者如果我知道这种类型的构造被称为的术语,我想可以为自己弄清楚。
编辑:
事实证明,我试图完成的可能是用UserControl最好的完成。 但显然我需要学习Silverlight中制作UserControls的一整套新规则。
总之,我想要这样的东西:
<CheckBox Click="myClickHandler" Name="myName"/><TextBlock Text="The label for the checkbox" />
...做成一个UserControl,我可以使用不同的名称和标签多次实例化。 所有复选框将使用相同的点击处理程序。
如果有人想甩掉一些快速的UserControl代码并发布它,我会很感激。 如果没有(我完全理解不想为别人做免费工作),我会开始使用谷歌搜索。
乍一看,它似乎是解决这个问题的正确方法,它看起来似乎是WPF和Silverlight之间的“另一种随意和任意的区别”。 但是,进行这种更改实际上并不产生可用的代码。
正如Klay在他的最新编辑中正确指出的那样,他实际上需要做的是为可变部分(文本等)生成带有依赖属性的UserControl。
以下是MSDN上的ResourceDictonary页面,其中包含有关格式的更多信息。
别忘了Silverlight并不是WPF的一个子集。 微软必须彻底重写运行Silverlight应用程序的代码,以便运行时间可以缩短。
编辑
您需要的XAML是:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyControls">
>
<Style TargetType="StackPanel">
<Setter Property="Template">
<Setter.Value>
<Control Template TargetType="local:myPanel">
<CheckBox x:Name="myCheckBox"
Content="{TemplateBinding CheckBoxLabel}"
Margin="8,0,2,0" Width = "100"/>
</Control>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
然后,您需要创建一个包含用户控件代码的cs文件:
namespace MyControls
{
public class myPanel : ContentControl
{
public myPanel()
{
DefaultStyleKey = typeof(myPanel);
}
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
CheckBox checkbox = GetTemplateChild("myCheckBox") as CheckBox;
checkbox.Click += CheckBoxClick;
}
void CheckBoxClick(object sender, RoutedEventArgs e)
{
CheckBox checkbox = sender as CheckBox;
// Do this CheckBox specific stuff
}
public string CheckBoxLabel
{
get { return (string)GetValue(CheckBoxLabelProperty); }
set { SetValue(CheckBoxLabelProperty, value); }
}
public static readonly DependencyProperty CheckBoxLabelProperty =
DependencyProperty.Register("CheckBoxLabel", typeof(string),
typeof(myPanel), null);
}
免责声明 - 我只是把它放在一个更复杂的用户控件中,所以不能保证它能“开箱即用”。 您可能需要稍微调整一下才能使其工作达到100%。
我不确定我是否会创建新的控件,因为不需要新的功能,在最坏的情况下,如果你真的想按照它的样子去镇上,你可能需要为CheckBox提供一个全新的模板。 不过,我怀疑你甚至需要在这种情况下触摸模板。
“ Padding
属性最终成为默认模板的内部ContentPresenter
的“ Margin
属性。 如果您的标签宽度必须为100像素,那么您可以将复选框控件宽度设置为116(复选框本身为16像素)。
因此,您所需的视觉效果可以通过以下方式进行处理: -
<CheckBox x:Name="myName" Content="The label for the checkbox"
Margin="8 2 0 2" Padding="8 0 0 0" Width="116" />
SL与WPF的一个关键区别是你不能在本地覆盖Type的样式。 您需要将控件的Style属性绑定到资源: -
<UserControl .... blah, blah>
<UserControl.Resources>
<Style x:Key="MyCheckBoxes" TargetType="CheckBox">
<Setter Name="Margin" Value="8 2 0 2" />
<Setter Name="Padding" Value="8 0 0 0" />
<Setter Name="Width" Value="116" />
</Style>
</UserControl.Resources>
<CheckBox x:Name="myName" Content="The label for the checkbox"
Style="{StaticResource MyCheckBoxes}" />
链接地址: http://www.djcxy.com/p/5887.html