代码之家  ›  专栏  ›  技术社区  ›  David

帮助理解Silverlight中资源/样式/xaml文件的关系

  •  0
  • David  · 技术社区  · 15 年前

    我是Silverlight的新手,我想完成一个相对简单的任务:
    创建一个“面板”控件,该控件将显示标题和一些子内容。

    我能够在一定程度上完成这项工作,但XAML的位置确实让我困惑。

    在我的页面上,我使用我的控件。这导致我的面板在子内容区域显示一个蓝色的按钮,顶部有一个20px的黄色标题,上面写着“下面是一些内容”。

    <UserControl x:Class="SilverlightApplication9.Page"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:SilverlightApplication9">
        <Grid Background="White">        
            <local:MyPanel Background="Blue">            
                    <Button Width="50" Height="25" Content="Hello"></Button>            
            </local:MyPanel>    
        </Grid>
    </UserControl>
    

    我的面板源代码很简单,只是:

    public partial class MyPanel : ContentControl
    {
        public MyPanel()
        {
            DefaultStyleKey = typeof(MyPanel);   
            InitializeComponent();         
        }
    }
    

    它是一个分部类,并且有一个附加的XAML文件,这就是我开始混淆的地方:

    如果我尝试将样式/模板代码放入分部类XAML文件中,它似乎被忽略(显示了我的按钮,但缺少其他内容,如颜色和文本)。

    <ContentControl x:Class="SilverlightApplication9.MyPanel"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:SilverlightApplication9">
        <ContentControl.Resources>
            <ResourceDictionary>
                <Style TargetType="local:MyPanel">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="local:MyPanel">
                                <Grid Background="Yellow">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="20" />
                                        <RowDefinition />
                                    </Grid.RowDefinitions>
                                    <TextBlock HorizontalAlignment="Center" Height="20" Grid.Row="0" Text="Below is some content"/>
                                    <Grid Grid.Row="1" Background="LightBlue">
                                        <ContentPresenter />
                                    </Grid>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ResourceDictionary>
        </ContentControl.Resources>
    </ContentControl>
    

    但是,如果我创建一个\themes\generic.xaml文件并粘贴在同一代码中,它就会工作。

    <ResourceDictionary 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="clr-namespace:SilverlightApplication9"
      xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
      >
        <Style TargetType="local:MyPanel">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:MyPanel">
                        <Grid Background="Yellow">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="20" />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <TextBlock HorizontalAlignment="Center" Height="20" Grid.Row="0" Text="Below is some content"/>
                            <Grid Grid.Row="1" Background="LightBlue">
                                <ContentPresenter />
                            </Grid>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
    

    显然,我缺少一些关于如何在项目中处理或使用资源或XAML文件的重要信息(我在Silverlight之前没有任何WPF经验)。

    我做错了什么,使我无法将面板的模板代码放入面板的XAML文件中?是否有一些关于XAML和资源的概念我弄错了?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Ireney Berezniak    15 年前

    大卫,你需要为你的样式创建一个键,并通过它的样式属性在面板中引用它…Silverlight的一个限制是,它不允许您创建应用于某种类型的所有元素的“全局”样式。

    正如您注意到的,当您将样式放在主题中时,这种行为是不同的。

    另一种选择是将样式放在面板本身的ResourceDictionary中,而不是页面/用户控件中,但是不能在其他面板中重用该样式。