2012-06-20 6 views
0

У меня есть базовый класс со следующим:пользовательский элемент управления WPF не изменяя

public class BodyBase : UserControl 
{ 

} 

Я тогда есть два пользовательских элементов управления WPF (WelcomeBody и SettingsBody), которые наследуют эту базу как:

public partial class WelcomeBody : BodyBase 
{ 
    public WelcomeBody() 
    { 
     InitializeComponent(); 
    } 
} 

I также изменили каждый файл XAML, чтобы отразить это BaseBody, и проблем там нет. Дизайнер в порядке, и я могу редактировать каждый элемент управления без проблем.

Я поместил BodyBase на моей форме WPF, как так:

<my:BodyBase x:Name="ApplicationBody" SnapsToDevicePixels="True" Background="#FFAA1111" Panel.ZIndex="-99" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1" /> 

тогда я на кнопку нажал:

private void WelcomeClick(object sender, RoutedEventArgs e) 
{ 
    MessageBox.Show("test"); 
    ApplicationBody = new WelcomeBody(); 
} 

Теперь во время выполнения, если я нажимаю кнопку, я получаю окно сообщения , а затем, как только я нажимаю ok в окне сообщения, ничего не происходит. Я отлаживался, и исключений не было, но ничего не значит, кроме того, что он не работает.

Что я делаю неправильно? Что мне нужно сделать, чтобы заставить этот пользовательский элемент управления переключиться.

Спасибо!

ответ

0

я должен был сделать

ApplicationBody.Content = new WelcomeBody(); 
1

ApplicationBody - это код, сгенерированный ссылкой на элемент управления bodybase, который инициализируется только один раз в частичном классе foo.g.cs. Родительский контейнер, который содержит элемент управления, например. Сетка имеет другую ссылку на ваш контроль «bodybase». Когда вы заменяете ссылку «ApplicationBody», сетка по-прежнему использует свою другую ссылку и указывает на исходное управление «bodybase». Вот почему вы не видите изменений. Вы можете это увидеть сами, посмотрев дочерние элементы родительского элемента управления после изменения «ApplicationBody».

Правильный способ сделать это в WPF является использование ContentPresenter

0

Вы все готовы иметь существующий контроль с таким именем, назначенный для объекта-контейнера. Попробуйте удалить элемент управления из контейнера и добавить новый в контейнер. Я обычно не назначаю Usercontrol в своем Xaml, я добавляю контейнер для элементов управления и меняю свои элементы в/из контейнера.

Если предположить, что контейнер представляет собой сетку с именем myGrid:

private void WelcomeClick(object sender, RoutedEventArgs e) 
{ 
    MessageBox.Show("test"); 
    Thickness margin = ApplicationBody.Margin; //Preserve Usercontrol Location Unless it fills Container 
    myGrid.Children.Remove(ApplicationBody); 
    ApplicationBody = new WelcomeBody(); 
    ApplicationBody.Margin = margin; 
    myGrid.Children.Add(ApplicationBody); 
} 
Смежные вопросы