2012-02-13 60 views
3

对不起,如果这个问题过于简单,但我很难弄清楚如何创建背景来控制 - 希望能够提高应用性能。皮肤控制背景 - 更好的性能?

我有9个不同的控件。他们都有背景。背景由图像,其他控件或两者组成。所有这些背景都有另一个背景。

想想像Powerpoint这样的幻灯片,幻灯片布局和幻灯片母版 - 按此顺序继承。我有9张幻灯片/控件。

  • 第3个控制具有相同的 “控制布局”(姑且称之为 ControlLayout1)。 ControlLayout1ControlMaster1获取它的一些元素。
  • 第二个3控件也具有相同的控件布局,但它与第一​​个控件不同。我们称之为ControlLayout2。它也 继承自ControlMaster1
  • 3个控件的最终集合再次不同。我们可以称它们为 ControlLayout3。但是这一次,他们继承了不同的主人 - ControlMaster2

现在在每个控件中,我每次都单独写出所有的XAML。我认为必须有一种方法,不要在每个项目中写入这些内容。理想情况下,我想创建的是一组可重用的XAML。

下面是一些伪XAML:

​​

然后某处ControlLayouts(我不知道,像Application.Resources或其他地方)

<Canvas x:Name="ControlLayout1"> 
    <MyMasterBackground (ControlMaster1)/> 
</Canvas> 

<Canvas x:Name="ControlLayout2"> 
    <MyMasterBackground (ControlMaster1)/> 
    <TextBox Text="The Control 2"> 
</Canvas> 

<Canvas x:Name="ControlLayout3"> 
    <MyMasterBackground (ControlMaster2)/> 
    <TextBox Text="The Control 3"> 
</Canvas> 

再来说ControlMasters

<Canvas x:Name="ControlMaster1"> 
    <Canvas.Background> 
     <ImageBrush ImageSource="/Images/image1.jpg" /> 
    </Canvas.Background> 
</Canvas> 

<Canvas x:Name="ControlMaster2"> 
    <Canvas.Background> 
     <ImageBrush ImageSource="/Images/image2.jpg" /> 
    </Canvas.Background> 
    <TextBox Text="Control Master 1"> 
</Canvas> 

一旦定义,ControlLayouts和ControlMaster永远不需要改变 - 它们是静态的。

除了只有一个较小的XAP,如果我可以将这些全部放在一个位置并重用XAML,我希望在我的应用程序中提高性能,因为ControlLayouts会自动获取BitmapCached或类似的东西。所以首先,是否有一个很好的策略来实现上述(ControlLayouts和Masters没有任何代码隐藏)?其次,在加载Control1,Control2等时性能会得到改善?最后,如果它们是纯粹的usercontrols(即它们有一些代码),那对性能会更好吗?

在此先感谢!

+0

如果你想让静态的东西成为BitmapCached,你应该手动设置它。某些东西是[自动缓存](http://msdn.microsoft.com/en-us/library/ff602285(v = vs.95).aspx),但根据我的经验手动设置它可以产生很大的差异,尤其是当您将UI元素转移到很多地方并看到生涩的表现时。 – 2012-02-23 04:45:40

回答

1

什么你问的是几件事情的组合:

关于背景的东西:只是在用户控件的代码后面创建类型刷的依赖属性(我们称之为MyBackgroundDP),并将其绑定你的XAML,如:

<UserControl ...> 
    <Grid Background={"Binding MyBackgroundDP, RelativeSource={RelativeSource Mode=FindAncestor, AncestoryType=UserControl}}"> 
    <!-- More XAML declarations --> 
    </Grid> 
</UserControl> 

要创建依赖属性,你可以使用内置的片段在Visual Studio:propdp
简单地写上“propdp”和TAB键两次。填写字段,这是很好的。

好吧,这很容易,对吗? ;)

现在更难的部分:制作所谓的母版页。
其实它和背景没什么不同。
声明另一个依赖项属性,仅此类型对象或FrameworkElement(更好)。

然后在您的XAML中,声明了一种占位符:ContentControl。让我们把它MyContentDP这个例子:

<UserControl ...> 
    <Grid Background={"Binding MyBackgroundDP, RelativeSource={RelativeSource Mode=FindAncestor, AncestoryType=UserControl}}"> 
    <ContentControl ContentTemplate="{Binding MyContentDP, RelativeSource={RelativeSource Mode=FindAncestor, AncestoryType=UserControl}}" /> 
    </Grid> 
</UserControl> 

你可以,那么你想在这个“母版视图”提供的任何其他微调,添加边框周围的电网,放一些鲜花,你的名字。

一旦你做,这是你如何使用它,假设它被称为的MyUserControl

<Window ... 
     xmlns:local="...reference_to_your_usercontrol_dll/exe"> 
    <Grid> 
     <local:MyUserControl MyBackgroundDP="Red"> 
     <local:MyUserControl.MyContentDP> 
      <!-- More XAML declarations here --> 
     </local:MyUserControl.MyContentDP> 
     </local:MyUserControl> 
    </Grid> 
</Window> 

现在的表现来看:

如果你把所有的XAML此为自定义控制(这是DIFFERENT from UserControl),那么你可以把所有的XAML放到你的App.xaml中
为什么?因为解析XAML可能是一项密集型操作,并且如果您在需要时使WP7/SL在运行时解析它,则会失去性能。
相反,你的App.xaml在启动时被解析,然后它在内存中。这就是加载你的应用程序的过程。你会得到性能提升,尽管对于由少量XAML组成的控件而言它是最小的,但这仍然是一个好习惯。

希望这会有所帮助,

Bab。