Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Автоматическое построение интерфейса по образцу


Автор: ercalote 23.1.2011, 20:50
Возьмем для наглядности любой мессенджер, к примеру, qip.

При начале диалога с новым юзером появляется новая вкладка с таким же интерфейсом, как и другие.

Как мне представляется, хорошим дизайном было бы прописывание один раз всего этого интерфейса с последующим его подгружением на новые вкладки.

Как такое поведение можно реализовать в WPF?

Предполагается, что образец построен XAML-разметкой.

Автор: vikaz 23.1.2011, 21:59
Один из вариантов использовать http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=RU-RU&k=k(SYSTEM.WINDOWS.CONTROLS.USERCONTROL);k(VS.XAMLEDITOR);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22)&rd=true. 

Автор: ercalote 23.1.2011, 23:13
UserControl в данной ситуации выглядит костылем smile

Автор: Bars1992 23.1.2011, 23:31
Всмысле "костылем"? Я считаю это самый разумный ответ. Создаешь свой кантрл, и при необходимости создаешь новый екземпляр. Если говорить на примере аськи то я представляю себе это так:
создаешь екземпляр твоего кантрала и в качестве контекста данных присоиденяешь обект который отвечает за отправку, визуализацию, и прием сообщений. Для работы собектом пишеш байдинг в кантроле к данному обекту. И Всё.

Можно ище использовать ресурсы тоесть, запихнуть туда твое окно, а потом штамповать екземпляри. Но это довольно сложно так как я слышал что нужно использовать ElementFactory или чтото подобное. Вобщем лишний геморой.

Автор: vikaz 24.1.2011, 06:03
Цитата(ercalote @  24.1.2011,  01:13 Найти цитируемый пост)
UserControl в данной ситуации выглядит костылем smile 

Если Вам не сложно, могли бы Вы разъяснить, почему UserControl является "костылем"? Похоже Вы знаете то, что не знают все остальные. Поделитесь своим драгоценным опытом.....  smile 



Цитата(Bars1992 @  24.1.2011,  01:31 Найти цитируемый пост)
Можно ище использовать ресурсы тоесть, запихнуть туда твое окно, а потом штамповать екземпляри. Но это довольно сложно так как я слышал что нужно использовать ElementFactory или чтото подобное. Вобщем лишний геморой. 

 smile 

Автор: Bars1992 24.1.2011, 09:45
Сначала дам цитаты с книжки:

Глава 3:
"... Имея шаблон, нужно заполнить дерево отображения. Оно задается с помощью VisualTree объекта ControlTemplate, которое имеет тип FrameworkelementFactory. Шаблон можно пременять к нескольким елементам управления, но каждый елемент должен встречатся в дереве не более одного раза. Чтоб решить эту проблему, объект FrameworkElementFactory конструирует новый екземпляр дерева отображения дя каждого елемента, используещего данный шаблон ..."


Глава 5:
Сначала идет описание ситуации что если запихнуть в ресурсы объект типа кнопки, то в коде его можно использовать только один раз:
Тут ошибки нету:
Код

    <Window.Resources>
        <Button x:Key="My"/>
    </Window.Resources>
    <StackPanel>
        <Button Content="{StaticResource My}"/>
    </StackPanel>

А тут будет:
Код

    <Window.Resources>
        <Button x:Key="My"/>
    </Window.Resources>
    <StackPanel>
        <Button Content="{StaticResource My}"/>
        <Button Content="{StaticResource My}"/>
        <Button Content="{StaticResource My}"/>
    </StackPanel>


И в конце написано:
"... В главе 3 мы узнали о том, что делать, когда ресурс требуется использовать более одного раза,- прибегнуть к классу FrameworkElementFactory ..."

Я так понял автор предлагает использовать ControlTemplate который каждый раз строит новое дерево отображения елементов, например вот:
Код

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ControlTemplate TargetType="{x:Type Button}"  x:Key="MyControl">
            <Button>Hello Everyone!!!</Button>
        </ControlTemplate>
    </Window.Resources>
    <StackPanel>
        <Button Template="{StaticResource MyControl}"/>
        <Button Template="{StaticResource MyControl}"/>
        <Button Template="{StaticResource MyControl}"/>
        <Button Template="{StaticResource MyControl}"/>
        <Button Template="{StaticResource MyControl}"/>
    </StackPanel>
</Window>



Или я не так всё понял?

Автор: vikaz 24.1.2011, 09:59
Не знаю даже, правильно или нет. Но я пока до такого не опускался. Вот тут приведен код с одной кнопкой, а что будет, если мне надо сформировать окно с 10-15 элементами, притом там будут присутствовать кнопки. Как я должен определить, какая кнопка вызвало определенное событие?

Автор: Bars1992 24.1.2011, 11:16
Вот:
Код

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="323" Width="525">
    <Window.Resources>
        <ControlTemplate x:Key="MyTab">
            <StackPanel>
                <TextBlock>Messages window</TextBlock>
                <RichTextBox Height="100"></RichTextBox>
                <TextBlock>Write message here:</TextBlock>
                <RichTextBox Height="100"></RichTextBox>
                <Button>Send</Button>           
            </StackPanel>
        </ControlTemplate>
    </Window.Resources>

    <TabControl Name="Tabs">
        <TabItem  Header="First">
            <ContentControl Template="{StaticResource MyTab}"/>
        </TabItem>
        <TabItem  Header="Second">
            <ContentControl Template="{StaticResource MyTab}"/>
        </TabItem>
    </TabControl>
</Window>



Обрабатывать нажатие кнопки можно привязавшысь к текущему контексту данных. Ну например как в моем примере для каждого таба создавать свой обект переписки. А при нажатии кнопки отыскать этот обект переписки текущего таба и вызвать например метод SendMessage().

Но всё это настолько геморно  smile что это того не стоит. Лутше создать свой UserControl и так будет намного правильней. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)