Фон управления скином - лучшая производительность? - PullRequest
3 голосов
/ 13 февраля 2012

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

У меня 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 и т. Д.?Наконец, если бы они были чистыми пользовательскими контролями (т. Е. У них был некоторый код), это было бы лучше для производительности?

Заранее спасибо!

1 Ответ

1 голос
/ 17 февраля 2012

То, что вы просите, является комбинацией нескольких вещей:

Об элементе Background: просто создайте свойство зависимостей (назовем его MyBackgroundDP) типа Brush в коде позади UserControl и привяжите его к вашему 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 из UserControl), вы можете затем поместить весь XAML в свой App.xaml
Зачем? потому что анализ XAML может быть интенсивной операцией, и если вы заставите WP7 / SL анализировать его во время выполнения всякий раз, когда вам это нужно, вы теряете производительность.
Вместо этого ваш App.xaml анализируется при запуске, а затем в памяти. Вот что делается при загрузке вашего приложения. Вы получите повышение производительности, хотя оно будет минимальным для элементов управления, сделанных из нескольких XAML, но это все еще хорошая практика.

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

Бабы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...