gpt4 book ai didi

silverlight - 蒙皮控制背景 - 更好的性能?

转载 作者:行者123 更新时间:2023-12-04 18:33:23 25 4
gpt4 key购买 nike

抱歉,如果这个问题过于简单,但我很难弄清楚如何为控件创建背景——希望它能提高应用程序的性能。

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

可以将其想象为带有幻灯片、幻灯片布局和幻灯片母版的 Power Point - 按此顺序继承。我有 9 张幻灯片/控件。

  • 前 3 个控件具有相同的“控件布局”(我们称之为
    控制布局1 )。 控制布局1 获取它的一些元素ControlMaster1 .
  • 后 3 个控件也有相同的控件布局,但它是
    与第一个不同。我们就叫它控制布局2 .它也是
    继承自 ControlMaster1 .
  • 最后一组 3 个控件再次不同。我们可以调用他们
    控制布局3 .但这一次,他们继承了不同的主人 - ControlMaster2 .

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

    这是一些伪 XAML:
    <UserControl x:Name="Control1">
    <MyBackground (ControlLayout1)/>
    </UserControl>

    <UserControl x:Name="Control2">
    <MyBackground (ControlLayout2)/>
    </UserControl>

    <UserControl x:Name="Control3">
    <MyBackground (ControlLayout3)/>
    </UserControl>

    然后某处为 控制布局 (我不知道,比如 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>

    然后是 控制大师
    <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 和 ControlMasters 永远不需要改变——它们是静态的。

    如果我可以将这些都放在一个位置并重用 XAML,那么除了拥有一个更小的 XAP 之外,我希望我的应用程序的性能会得到提高,因为 ControlLayouts 会自动获取 BitmapCached 或类似的东西。

    那么首先,是否有一个好的策略来实现上述(ControlLayouts 和 Masters 没有任何代码隐藏)?其次,在加载 Control1、Control2 等时会提高性能吗?最后,如果它们是纯用户控件(即它们背后有一些代码),那对性能会更好吗?

    提前致谢!

    最佳答案

    您要求的是几件事的组合:

    关于背景的事情:只需在 UserControl 后面的代码中创建一个 Brush 类型的依赖属性(我们称之为 MyBackgroundDP),并将其绑定(bind)到您的 XAML,如:

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

    要创建依赖属性,您可以使用 Visual Studio 中的内置片段: propdp只需将“propdp”和那个 TAB 写两次。填满字段,一切都很好。

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

    现在是更难的部分:制作所谓的母版页。
    其实它和背景没有太大区别。
    声明另一个依赖属性,只有这一次是 object 类型,或者 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 来自 UserControl),则可以将所有 XAML 放入 App.xaml
    为什么?因为解析 XAML 可能是一项密集的操作,如果您让 WP7/SL 在运行时在需要时解析它,则会失去性能。
    相反,您的 App.xaml 在启动时被解析,然后它在内存中。这就是加载应用程序时所做的事情。您将获得性能提升,尽管对于由少量 XAML 组成的控件来说这将是最小的,但它仍然是一个很好的做法。

    希望这可以帮助,

    呸。

    关于silverlight - 蒙皮控制背景 - 更好的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9266886/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com