首页 文章

wpf到silverlight xaml问题

提问于
浏览
2

好的,我有一个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次,第二个错误出现一次)

我可以通过将“{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 回答

  • 1

    乍一看似乎是解决问题的正确方法,它似乎是WPF和Silverlight之间的“另一个随机和任意差异” . 但是,进行此更改实际上并不会产生有效的代码 .

    正如Klay在他最新的编辑中指出的那样,他实际需要做的是生成一个UserControl,其中包含可变部分的依赖属性(Text等) .

    这是ResourceDictonary page on MSDN,其中包含有关格式的更多信息 .

    不要忘记Silverlight实际上不是WPF的子集 . Microsoft必须完全重写运行Silverlight应用程序的代码,以便运行时只需很少的下载 .

    EDIT

    您需要的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);
     }
    

    免责声明 - 我've just put this together from a more complex user control so there'不保证'll work 2611602 . You' ll可能需要调整一下才能让它100%正常工作 .

  • 2

    我不确定我是否会打扰创建新的控件,因为不需要新的功能,在最坏的情况下,如果你真的想以它看起来的方式去城镇,你可能需要为CheckBox提供一个全新的模板 . 但是我怀疑你甚至需要在这种情况下触摸模板 .

    Padding 属性最终为默认模板的内部 ContentPresenterMargin 属性 . 如果必须使标签宽度恰好为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" />
    

    与WPF相比,SL的一个关键区别是您无法在本地覆盖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}" />
    

相关问题