2012-02-13 3 views
3

извините, если этот вопрос слишком прост, но мне сложно понять, как создавать фоны для элементов управления - в надежде, что это улучшит производительность приложения.Skinning Control Backgrounds - лучшая производительность?

У меня есть 9 различных элементов управления. Все они имеют фон. Фоны состоят из изображений, других элементов управления или того и другого. Все эти фоны имеют другой фон.

Думайте об этом как о Power Point со слайдами, слайдами и слайдами, унаследованными в этом порядке. У меня 9 слайдов/элементов управления.

  • Первые 3 управления имеют один и тот же «раскладку управления» (назовем его ControlLayout1). ControlLayout1 получает некоторые из его элементов из ControlMaster1.
  • Вторые 3 элемента управления также имеют одинаковый макет управления, но это отличается от первого. Назовем это ControlLayout2. Он также унаследовал от ControlMaster1.
  • Окончательный набор из 3 элементов управления снова разный. Мы можем позвонить им ControlLayout3. Но на этот раз они унаследовали от другого мастера - 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> 

А потом где-то 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 и ControlMasters никогда не нужно менять - они являются статическими.

За исключением того, что у меня меньше XAP, если я могу разместить их в одном месте и повторно использовать XAML, я надеюсь, что производительность будет улучшена в моем приложении, поскольку ControlLayouts автоматически получит BitmapCached или что-то в этом роде.

Итак, во-первых, есть ли хорошая стратегия для реализации вышеизложенного (у ControlLayouts и Masters нет никакого кода)? Во-вторых, производительность будет улучшена при загрузке Control1, Control2 и т. Д.? Наконец, если бы они были чистым пользовательским контролем (т. Е. У них был некоторый код), было бы лучше для производительности?

Заранее благодарен!

+0

Если вы хотите, чтобы статические вещи были BitmapCached, вы должны просто установить его вручную. Некоторые вещи [авто-кешированные] (http://msdn.microsoft.com/en-us/library/ff602285 (v = vs.95) .aspx), но по моему опыту настройка вручную может привести к большой разнице, особенно когда вы перемещаете элементы пользовательского интерфейса вокруг много и видите резкую производительность. –

ответ

1

Что вы просите это сочетание нескольких вещей:

О фоновой вещи: просто создать свойство зависимостей (назовем его MyBackgroundDP) типа кисти в коде позади из UserControl, и привязать его чтобы ваш XAML как:

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

чтобы создать свойство зависимостей, вы можете использовать встроенный фрагмент кода в визуальной студии: 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 для этого в качестве контроля пользовательского (который является РАЗЛИЧНЫМ из UserControl), вы можете поместить все XAML в свой App.xaml
Почему? потому что синтаксический анализ XAML может быть интенсивной операцией, и если вы сделаете WP7/SL разбора во время выполнения, когда вам это нужно, вы потеряете производительность.
Вместо этого ваш App.xaml получает синтаксический анализ при запуске, затем он находится в памяти. Это то, что сделано при загрузке вашего приложения. Вы получите повышение производительности, хотя это будет минимальным для элементов управления, состоящих из немногих XAML, но это хорошая практика.

Надеюсь, что это поможет,

Баб.

Смежные вопросы