2010-08-18 3 views
2

Вот простой пример: запустите VS2010 или VS2008, новый проект WPF (.Net Framework 3.5 sp1), добавьте пустую страницу (Page1.xaml) в проект.Frame.Content, операция назначения не работает?

Код остальное в MainWindow.xaml.cs:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     TestFrameContent(); 
    } 

    private void TestFrameContent() 
    { 
     FrameworkElement fe = Activator.CreateInstance(Type.GetType("WpfFrameContentProblem.Page1")) as FrameworkElement; 
     Frame frmContainer = new Frame(); 
     frmContainer.Content = fe; 

     Debug.Assert(frmContainer.Content != null, "Content is null"); 
    } 
} 

Запустите приложение, он потерпит неудачу на Debug.Assert, показывают, что frmContainer.Content == NULL.

Это действительно загадка для меня, что простое назначение не удастся. Кто угодно?

ответ

3

К сожалению, это не простое задание. Настройка свойства Content на кадре фактически вызывает Navigate, который устанавливает контент асинхронно. Вам нужно будет обработать событие Navigated, которое «происходит, когда найденный контент, который был перемещен, доступен и доступен из свойства« Содержимое », хотя он, возможно, не завершил загрузку».

private void TestFrameContent() 
{ 
    FrameworkElement fe = Activator.CreateInstance(
     Type.GetType("WpfFrameContentProblem.Page1")) as FrameworkElement; 
    Frame frmContainer = new Frame(); 
    frmContainer.Content = fe; 
    frmContainer.Navigated += delegate(object sender, NavigationEventArgs e) 
    { 
     // This will succeed 
     Debug.Assert(frmContainer.Content != null, "Content is null"); 
    }; 
} 
+0

спасибо. Я предполагаю, что в этом случае я должен использовать ContentControl в качестве контейнера FrameworkElemnt. Скажите, пожалуйста, ContentControl.Content = x - это простое назначение :) – neolei

+0

@ sun1991: Ну, это назначение свойства зависимостей, поэтому я все равно не назвал бы его «простым». У вас может быть двусторонняя привязка к свойству Content, и обновление будет перенесено на другой объект. ContentControl не выполняет принудительное значение стоимости, например Frame, поэтому он должен по крайней мере * действовать *, как простое присвоение свойств :). – Quartermeister

0

См WPF Frame, Content and ContentRendered

Ваш кадр не будет, однако, никогда не будет оказана, так как он не является частью любого визуального дерева. Ниже образец работает, как ожидалось.

XAML:

<Window x:Class="FrameTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <Frame Name="_frame" /> 
    </StackPanel> 
</Window> 

код позади:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     FrameworkElement fe = Activator.CreateInstance(Type.GetType("WpfFrameContentProblem.Page1")) as FrameworkElement; 

     _frame.Content = fe; 
     _frame.ContentRendered += 
      (sender, e) => 
       MessageBox.Show("Type of content = " + (sender as Frame).Content.GetType()); 
    } 
} 
Смежные вопросы