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

    上一篇: wpf to silverlight xaml issue

    下一篇: Can't create xmlns reference to other project in XAML