Почему все объекты в этом расширении usercontrol null во время выполнения? - PullRequest
3 голосов
/ 30 марта 2010

Все,

У меня есть простой класс.

public class Container : UserControl
{
    public bool IsClickable { get; set; }
}

У меня есть класс, который расширяет этот класс.

public class ScrollingContainer : Container
{
    public void Draw()
    {

    }

    public void Update()
    {

    }
}

У меня есть собственный класс,затем он расширяет ScrollingContainer.

public partial class MaskContainer : ScrollingContainer
{

    public MaskContainer()
    {
        InitializeComponent();
    }
}

XAML

<local:ScrollingContainer x:Class="Test.Types.MaskContainer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:GameObjects;assembly=GameObjects"
    mc:Ignorable="d"
    >
</local:ScrollingContainer>

В моем mainpage.xaml у меня есть следующее.

<types:MaskContainer x:Name="maskContainer" Canvas.ZIndex="1" Width="Auto" Height="Auto">
       <Canvas x:Name="maskCanvas">
           <Button x:Name="button1" Content="test button"/>
       </Canvas>
</types:MaskContainer>

Почему во время выполненияоба maskCanvas и button1 нулевые?maskContainer не является нулевым.

Наследование здесь должно быть простым.Контейнер наследует пользовательский контроль.Контролируемый контейнер наследует контейнер.Mask Container наследует прокручиваемый контейнер.Почему я теряю функциональность исходного базового класса на этом уровне?Неправильно ли добавить элемент (button1) в maskcontainer внутри main.xaml?

Моя конечная цель - создать контейнер, который можно использовать повторно, но он наследует все свойства / методы, которые я указывал на протяжении всегоцепь.

Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 04 апреля 2010

Проблема в том, что MaskContainer имеет прикрепленный файл XAML, который заставляет кодер WPF генерировать класс, который реализует System.Windows.Markup.IComponentConnector. И когда элемент управления реализует этот интерфейс, он получает совершенно новое качество: он становится корнем области именования . Это означает, что внутри такого элемента управления есть отдельное пространство имен. Имена элементов управления снаружи не конфликтуют с внутренними.

В данном конкретном случае это означает, что и maskCanvas, и button1 не видны из mainpage по имени, а вместо этого видны из MaskContainer.

На самом деле, я очень удивлен, что вам даже удалось как-то скомпилировать это. По моему опыту, если вы попробуете этот трюк с Visual Studio, он будет жаловаться на то, что maskCanvas относится к " в рамках элемента MaskContainer ". Вы случайно используете компиляцию из командной строки?

Хорошо, хватит, бла-бла-бла.

В чем решение? Просто удалите файл XAML из MaskContainer. Это избавит от автоматически сгенерированной IComponentConnector реализации, и все будет работать так, как вы ожидаете.

0 голосов
/ 05 апреля 2010

На самом деле я обнаружил, что при текущем RC вы не можете расширить пользовательский контроль, как я пытался сделать. В итоге я решил решить эту проблему (пока), чтобы обмануть ожидания системы и расширить Canvas вместо пользовательского контроля. Я бы предпочел расширить пользовательский контроль, ну да ладно. Пока этого будет достаточно.

0 голосов
/ 30 марта 2010

Убедитесь, что InitializeComponent () действительно вызывается, прежде чем проверять свои переменные.

В противном случае эти переменные будут нулевыми.

Я выполнил вышеупомянутое без проблем, хотя обычно использовал другие элементы управления, такие как Grid, Canvas и т. Д.

Еще одна вещь, которую нужно проверить: есть ли в классе Container Xaml? Я не верю, что вы можете создать подкласс и использовать Xaml в классе, который уже использует Xaml.

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