XAML-код для размещения класса управления - PullRequest
0 голосов
/ 02 июня 2011

Я очень плохо знаком с WPF и XAML и не совсем понимаю, как сделать следующее (VS2010, WPF, VB.net):

У меня есть собственный класс, который наследуется от TabItem, и в этом классе у меня есть несколько элементов управления, которые я хочу на своей вкладке, RichTextBox и TextBox. Эти TabItems будут динамически создаваться во время выполнения и добавляться в TabControl по мере необходимости. Как создать код XAML и сохранить его, чтобы при динамическом создании пользовательского класса во время выполнения он размещал два элемента управления по мере необходимости?

    Public Class CodePage : Inherits TabItem
        Private RTB As RichTextBox
        Private TB As TextBox
        ...
    End Class

Мое предположение на XAML:

    <Window x:Class="MainWindow"
        xmlns:local="clr-namespace:KRL" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        <Style TargetType="{x:Type local:CodePage}">
            <Grid>
                NEED HELP HERE
            </Grid>
        </Style>

        <Grid>
            ...
        </Grid>
    </Window

Заранее спасибо и извините, если об этом уже спрашивали, я пытался исследовать и не понимаю.

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Прежде всего, ваш пользовательский TabItem должен переопределить метаданные, чтобы подобрать правильный стиль на основе вашего нового типа, а не вашего базового класса (извинения - я использовал C #, потому что я недостаточно опытен в VB):

public static CodePage()
{
    FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(
        typeof(CodePage),
        new FrameworkPropertyMetadata(typeof(CodePage)));
}

Это позволит вам определить стиль по умолчанию в вашей теме (Generic.xaml) следующим образом:

<Style TargetType="{x:Type local:CodePage}">
    ...
</Style>

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

Судя по всему, вы создали элементы управления в коде, а не в своем шаблоне. Это ошибка. Вместо этого вы должны определить свойства зависимостей для хранения данных в вашем классе CodePage и определить внешний вид в вашем шаблоне (будь то текстовые поля, расширенные текстовые поля или что-то еще). Пример шаблона может выглядеть так:

<Style ...>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CodePage}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <TextBox Text="{TemplateBinding Property1}"/>
                    <TextBox Grid.Column="1" Text="{TemplateBinding Property2}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>

Тогда я смог бы использовать ваш класс CodePage следующим образом:

<TabControl>
    <whatever:CodePage Header="Hello" Property1="Foo" Property2="Bar"/>
</TabControl>

Скорее всего, вам понадобится пользовательский TabControl, который переопределяет генерацию контейнера для возврата экземпляров вашего CodePage вместо TabItem, но это уже другая история.

1 голос
/ 02 июня 2011

Только два моих чувства, но похоже, что вы пишете так, как если бы вы использовали приложение WinForms.С мощью, которую имеет WPF, вам, вероятно, вообще не нужно наследовать ваш CodePage от TabItem.Вы смотрели какие-нибудь статьи о MVVM там?На высоком уровне я бы сказал, что вы хотите вместо этого создать CodePageViewModel, а затем создать DataTemplate, чтобы он правильно отображал ваши элементы управления в Microsoft TabItem.

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