PRISM RegionManager — создание ItemsControl RegionManager без использования XAML

У меня небольшая проблема с регионами в PRISM. Все базовые тесты работают нормально, но теперь я хочу заменить следующий XAML на чистый C#:

<UserControl x:Class="CAL.Modules.Simple.Region_Testing.RegionManagerTypes.XAML.ItemsControlRegionAdapterTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cal="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"
    Height="Auto" Width="Auto">
        <ItemsControl cal:RegionManager.RegionName="ItemsControlRegionAdapterTestRegion"/>
</UserControl>

Код внутри моего тестового класса довольно прост, я обращаюсь к RegionManager и добавляю несколько тестовых представлений. Однако, как видно из приведенного выше кода XAML, в UserControl фактически ничего не происходит, кроме присоединения RegionManager к элементу управления. Я уверен, что это должно быть возможно в коде, расширяя следующие строки, которые у меня уже есть:

        // MISSING
        // Creating the UserControl in CODE instead of XAML


        // Create the UserControl and add it to the main window
        regionManager.AddToRegion(RegionNames.MainRegion, new ItemsControlRegionAdapterTest());

        // Add some views to the region inside the user control
        var currentTestRegionName = TestingRegionNames.ItemsControlRegionAdapterTestRegion;
        regionManager.Regions[currentTestRegionName].Add(new BlueView());
        regionManager.Regions[currentTestRegionName].Add(new RedView());

Спасибо за любые советы...


person Christian Ruppert    schedule 02.08.2009    source источник


Ответы (2)


Хорошо, подход XamlReader работает (небольшие исправления, см. приложенный исходный код)...

Но, честно говоря, это выглядит немного некрасиво :-) Так что, если кто-нибудь знает, как "прикрепить regionManager в коде", подробности приветствуются. Во-первых, рабочие строки чтения XAML:

        // MISSING
        // Creating the UserControl in CODE instead of XAML
        var obj = (UserControl)XamlReader.Parse(@"<UserControl xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                                                               xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
xmlns:cal=""clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation""
Height=""Auto"" Width=""Auto"">
    <ItemsControl cal:RegionManager.RegionName=""ItemsControlRegionAdapterTestRegion""/></UserControl>");

        // Create the UserControl and add it to the main window
        regionManager.AddToRegion(RegionNames.MainRegion, obj);

ПОНЯТНО!! (по крайней мере, это работает, не уверен, что это лучшая практика)

        var uC = new UserControl();
        var iC = new ItemsControl();
        uC.Content = iC;

        RegionManager.SetRegionName(iC, "ItemsControlRegionAdapterTestRegion");

        regionManager.AddToRegion(RegionNames.MainRegion, uC);

Спасибо за помощь... Комментарии по-прежнему приветствуются...

person Christian Ruppert    schedule 02.08.2009
comment
Обратите внимание, что этот уродливый способ на самом деле является способом, рекомендованным Microsoft. Способ только с кодом еще уродливее, и если хотите, я тоже могу опубликовать его. - person Kenan E. K.; 03.08.2009
comment
Вы имеете в виду, что для более сложных примеров рекомендуется использовать средство чтения XAML. Потому что в этой (очень-очень простой) вещи мне больше нравится подход к коду.. (это было не так уж сложно, просто пришлось посмотреть на это несколько раз с некоторым творческим вкладом с вашей стороны :-) - person Christian Ruppert; 03.08.2009
comment
Это правильный способ сделать это. Обратите внимание, что порядок выполнения AddToRegion и SetRegionName не имеет значения. Просто совет. - person Anderson Imes; 03.08.2009

Попробуйте XamlReader подход:

private const string xaml = @"
<UserControl x:Class=""CAL.Modules.Simple.Region_Testing.RegionManagerTypes.XAML.ItemsControlRegionAdapterTest""
    xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
    xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
    xmlns:cal=""clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation""
    Height=""Auto"" Width=""Auto"">
        <ItemsControl cal:RegionManager.RegionName=""ItemsControlRegionAdapterTestRegion""/>
</UserControl>";

//in some method
public void RunMethod()
{
     //create object and cast it
     ItemsControlRegionAdapterTest obj = (ItemsControlRegionAdapterTest) XamlReader.Parse(xaml);
}
person Kenan E. K.    schedule 02.08.2009
comment
Да, он работает и лучше, чем файл XAML (чище). Но выглядит все равно немного некрасиво. Добавил рабочий пример в ответ (если кому надо). Возможно, у кого-то есть другой подход, но спасибо. По крайней мере, больше нет файла XAML... - person Christian Ruppert; 03.08.2009