Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Imitator
Просто интересуюсь.
39 / 39 / 9
Регистрация: 19.10.2011
Сообщений: 245
1

Как узнать базовый Template (Шаблон) элемента в WPF?

23.11.2011, 20:11. Просмотров 2451. Ответов 10
Метки нет (Все метки)

Всем привет! Извините за глупый, может быть, вопрос есть ли возможность в WPF узнать базовый шаблон элемента, в частности ComboBox, в Blend это возможно, а вот в WPF? Или может есть какая-нибудь программа для этого? Заранее спасибо!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2011, 20:11
Ответы с готовыми решениями:

WPF! XAML template via DevExpress Grid
Добрый день уважаемы коллеги программисты, Помогите роздуплить как сделать одну...

Как перенести проект с WF на WPF используя шаблон MVVM?
Есть уже созданный проект на форме, со всеми проверками и данными, теперь его...

Как узнать получить данные из GridViewColum в listView C# WPF
Создаю простой файловый менеджер и не могу получить из: <GridViewColumn...

[WPF] Как узнать в какой строке DataGrid был клик по кнопке?
Есть DataGrid, в нем есть столбец с кнопкой : <DataGridTemplateColumn...

Как на модель из Blender наложить текстуру элемента WPF?
Здравствуйте. Может кто знает как одеть текстуру элемента на модель созданную в...

10
Casper-SC
Эксперт .NET
3618 / 1827 / 355
Регистрация: 27.03.2010
Сообщений: 5,136
Записей в блоге: 1
24.11.2011, 02:18 2
Цитата Сообщение от Imitator Посмотреть сообщение
в Blend это возможно, а вот в WPF?
По сути Blend и WPF это вообще-то совершенно разные вещи. Expression Blend это среда разработки, а WPF это технология .NET. Что в Blend, что в Visual Studio WPF и будет WPF'ом.

Точно не уверен, но может так:
C#
1
ControlTemplate template = comboBox1.Template;
1
maratoss
64 / 48 / 10
Регистрация: 03.04.2011
Сообщений: 116
24.11.2011, 08:56 3
Можно через .NET Reflector или в Telerik JustDecompile
Загружаешь dll и в ресурсах dll будут все ксамлы файлы с шаблонами, стилями.
0
Ilya81
149 / 149 / 30
Регистрация: 19.10.2009
Сообщений: 319
24.11.2011, 09:03 4
Кстати, его действительно можно прочитать из свойства компонента, а затем преобразовать в XAML с помощью XamlWriter'а, т. е. как б сделать это из своей небольшой программы (я сам никогда не задумывался, что можно так).
1
WonderFlik
207 / 137 / 15
Регистрация: 28.04.2011
Сообщений: 389
24.11.2011, 11:06 5
на msdn есть дефолтные шаблоны для всех контролов
1
Imitator
Просто интересуюсь.
39 / 39 / 9
Регистрация: 19.10.2011
Сообщений: 245
24.11.2011, 13:19  [ТС] 6
Цитата Сообщение от Casper-SC Посмотреть сообщение
По сути Blend и WPF это вообще-то совершенно разные вещи. Expression Blend это среда разработки, а WPF это технология .NET. Что в Blend, что в Visual Studio WPF и будет WPF'ом.
Я думаю было понятно, что я имел ввиду Visual Studio WPF.
0
Casper-SC
Эксперт .NET
3618 / 1827 / 355
Регистрация: 27.03.2010
Сообщений: 5,136
Записей в блоге: 1
24.11.2011, 16:43 7
Цитата Сообщение от Imitator Посмотреть сообщение
Я думаю было понятно, что я имел ввиду Visual Studio WPF.
Честно говоря мне было вообще не понятно. Иначе я бы не стал писать ответ кодом. Просто как бы нужно называть вещи своими именами. А то можно много сочинить примеров, где меня никто не поймёт.
0
Imitator
Просто интересуюсь.
39 / 39 / 9
Регистрация: 19.10.2011
Сообщений: 245
24.11.2011, 23:52  [ТС] 8
Ну, что-же Вы какой непонятливый-то?)) Все остальные поняли и не умничали, а Вы самый самый значит?))
0
Casper-SC
Эксперт .NET
3618 / 1827 / 355
Регистрация: 27.03.2010
Сообщений: 5,136
Записей в блоге: 1
25.11.2011, 00:12 9
Цитата Сообщение от Imitator Посмотреть сообщение
Ну, что-же Вы какой непонятливый-то?)) Все остальные поняли и не умничали, а Вы самый самый значит?))
Далеко не факт что все поняли (с чего такие предположения???). Я вообще-то подумал, что Вы не совсем понимаете то, о чём говорите, вот и объяснил. Просто скорее всего остальные не стали заморачиваться, так как им всё равно, я решил объяснить.

Цитата Сообщение от Imitator Посмотреть сообщение
есть ли возможность в WPF узнать базовый шаблон элемента, в частности ComboBox, в Blend это возможно, а вот в WPF?
Наводит только на мысль о коде, что типа: "в Blend я в курсе как сделать, а кодом нет". Конечно немного тупей звучит, но Ваш вопрос похож на один из следующих:
Как узнать в Visual Studio есть ли возможность создавать шаблоны, а в C#? Возможно ли у этого сделать этот метод как в WPF, а не как в Blend (ну где тут логика в вопросе?)?

А Вы самый-самый, что Вам нельзя подсказать или я должен телепатически получить информацию, что Вы в курсе и под WPF подразумеваете Visual Studio? Сколько угодно можно спорить, но для меня это не нормально.
0
alexsave
256 / 186 / 30
Регистрация: 18.08.2010
Сообщений: 229
Завершенные тесты: 2
29.11.2011, 06:54 10
Лучший ответ Сообщение было отмечено как решение

Решение

Все делается просто. Чтобы извлечь шаблон элемента из его свойства Template и сериализовать его в XAML нужно использовать класс XamlWriter, вот готовый пример такого приложения:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="ControlTemplateBrowser.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ControlTemplateBrowser" Height="544" Width="713" Loaded="Window_Loaded"
    >
    <Grid Margin="10" Name="grid">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"></ColumnDefinition>
        <ColumnDefinition Width="3*"></ColumnDefinition>
      </Grid.ColumnDefinitions>
      <ListBox DisplayMemberPath="Name" Name="lstTypes" SelectionChanged="lstTypes_SelectionChanged"></ListBox>
      <TextBox Grid.Column="1" Name="txtTemplate" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" FontFamily="Consolas"></TextBox>
      
    </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Reflection;
using System.Xml;
using System.Windows.Markup;
 
 
namespace ControlTemplateBrowser
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
 
    public partial class Window1 : System.Windows.Window
    {
 
        public Window1()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, EventArgs e)
        {                    
            Type controlType = typeof(Control);
            List<Type> derivedTypes = new List<Type>();
 
            // Ищем все типы в Control
            Assembly assembly = Assembly.GetAssembly(typeof(Control));
            foreach (Type type in assembly.GetTypes())
            {
                // Добавляем их в колекцию
                if (type.IsSubclassOf(controlType) && !type.IsAbstract && type.IsPublic)
                {
                    derivedTypes.Add(type);
                }
            }
            
            // Сортируем в алфавитном порядке
            derivedTypes.Sort(new TypeComparer());
 
            // Показываем в ListBox
            lstTypes.ItemsSource = derivedTypes;
        }
 
        private void lstTypes_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {            
            try
            {
                Type type = (Type)lstTypes.SelectedItem;                                            
 
                // Используем полученный тип
                ConstructorInfo info = type.GetConstructor(System.Type.EmptyTypes);
                Control control = (Control)info.Invoke(null);
                                
                Window win = control as Window;
                if (win != null)
                {                    
                    // Создадим новое окно
                    win.WindowState = System.Windows.WindowState.Minimized;
                    win.ShowInTaskbar = false;
                    win.Show();
                }
                else
                {
                    control.Visibility = Visibility.Collapsed;
                    grid.Children.Add(control);
                }
 
                // Получаем шаблон
                ControlTemplate template = control.Template;
 
                // Парсим в XAML
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                StringBuilder sb = new StringBuilder();
                XmlWriter writer = XmlWriter.Create(sb, settings);
                XamlWriter.Save(template, writer);
 
                // Результат выводим в TextBox
                txtTemplate.Text = sb.ToString();
                
                // Убираем контрол
                if (win != null)
                {
                    win.Close();
                }
                else
                {
                    grid.Children.Remove(control);
                }
            }
            catch (Exception err)
            {
                txtTemplate.Text = "<< Error generating template: " + err.Message + ">>";
            }
        }
    }
 
    public class TypeComparer : IComparer<Type>
    {
        public int Compare(Type x, Type y)
        {
            return x.Name.CompareTo(y.Name);
        }
    }
}
В результате получаем шаблоны всех элементов управления!
5
Миниатюры
Как узнать базовый Template (Шаблон) элемента в WPF?  
dioxidin
132 / 99 / 11
Регистрация: 21.11.2007
Сообщений: 544
01.12.2011, 16:29 11
Цитата Сообщение от alexsave Посмотреть сообщение
Все делается просто. Чтобы извлечь шаблон элемента из его свойства Template и сериализовать его в XAML нужно использовать класс XamlWriter, вот готовый пример такого приложения:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="ControlTemplateBrowser.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ControlTemplateBrowser" Height="544" Width="713" Loaded="Window_Loaded"
    >
    <Grid Margin="10" Name="grid">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"></ColumnDefinition>
        <ColumnDefinition Width="3*"></ColumnDefinition>
      </Grid.ColumnDefinitions>
      <ListBox DisplayMemberPath="Name" Name="lstTypes" SelectionChanged="lstTypes_SelectionChanged"></ListBox>
      <TextBox Grid.Column="1" Name="txtTemplate" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" FontFamily="Consolas"></TextBox>
      
    </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Reflection;
using System.Xml;
using System.Windows.Markup;
 
 
namespace ControlTemplateBrowser
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
 
    public partial class Window1 : System.Windows.Window
    {
 
        public Window1()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, EventArgs e)
        {                    
            Type controlType = typeof(Control);
            List<Type> derivedTypes = new List<Type>();
 
            // Ищем все типы в Control
            Assembly assembly = Assembly.GetAssembly(typeof(Control));
            foreach (Type type in assembly.GetTypes())
            {
                // Добавляем их в колекцию
                if (type.IsSubclassOf(controlType) && !type.IsAbstract && type.IsPublic)
                {
                    derivedTypes.Add(type);
                }
            }
            
            // Сортируем в алфавитном порядке
            derivedTypes.Sort(new TypeComparer());
 
            // Показываем в ListBox
            lstTypes.ItemsSource = derivedTypes;
        }
 
        private void lstTypes_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {            
            try
            {
                Type type = (Type)lstTypes.SelectedItem;                                            
 
                // Используем полученный тип
                ConstructorInfo info = type.GetConstructor(System.Type.EmptyTypes);
                Control control = (Control)info.Invoke(null);
                                
                Window win = control as Window;
                if (win != null)
                {                    
                    // Создадим новое окно
                    win.WindowState = System.Windows.WindowState.Minimized;
                    win.ShowInTaskbar = false;
                    win.Show();
                }
                else
                {
                    control.Visibility = Visibility.Collapsed;
                    grid.Children.Add(control);
                }
 
                // Получаем шаблон
                ControlTemplate template = control.Template;
 
                // Парсим в XAML
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                StringBuilder sb = new StringBuilder();
                XmlWriter writer = XmlWriter.Create(sb, settings);
                XamlWriter.Save(template, writer);
 
                // Результат выводим в TextBox
                txtTemplate.Text = sb.ToString();
                
                // Убираем контрол
                if (win != null)
                {
                    win.Close();
                }
                else
                {
                    grid.Children.Remove(control);
                }
            }
            catch (Exception err)
            {
                txtTemplate.Text = "<< Error generating template: " + err.Message + ">>";
            }
        }
    }
 
    public class TypeComparer : IComparer<Type>
    {
        public int Compare(Type x, Type y)
        {
            return x.Name.CompareTo(y.Name);
        }
    }
}
В результате получаем шаблоны всех элементов управления!
Только результат чуток замусорен:
к примеру вместо
XML
1
<Expander IsExpanded="True"/>
получаем что-то типа
XML
1
2
3
4
5
<Expander>
    <Expander.IsExpanded>
        <s:bool>True</s:bool>
    </Expander.IsExpanded>
</Expander>
В деталях мог ошибиться, но суть понятна должна быть. Сырой вывод нужно причесывать. Там если через нэймспейс либу с чартами, к примеру, подключать к шаблону, а потом сериализовать такой шаблон, то вместо указанного в оригинале нэймспейса будет "assembly:...". У меня во всяком случае так было.

Да и XmlWriter там не нужен. Достаточно StringWriter'а
Вот как у меня покомпактнее было (тоже пример из сети):
C#
1
2
3
4
5
6
var sb = new StringBuilder();
            using (TextWriter writer = new StringWriter(sb))
            {
                XamlWriter.Save(ContextRibbonGroup.Template, writer);
                XamlWriter.Save(ContextRibbonControlGroup.Template, writer);
            }
Добавлено через 11 минут
Оговорюсь про ненужность XmlWriter'а.. Все равно полученный текст в студию вставлять - она подсветит нормально и отступы расставит.. Нет смысла париться.
0
01.12.2011, 16:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2011, 16:29

Как определить клик, вне элемента формы WPF
Всем привет, помогите решить проблему, на WPF панели имеется кнопка, при...

Как сделать шаблон Background'a для каждого элемента в ComboBox
Доброго времени суток! У меня есть код: for (int i = 0; i &lt; macroses.Count;...

Как правильней будет описать шаблон элемента ячейки в DataGrid?
Доброго времени суток. Интересует довольно-таки простой вопрос (не для меня,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru