Frame.Content, операция присваивания не работает? - PullRequest
2 голосов
/ 18 августа 2010

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

Остальной кодв 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.

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

Ответы [ 2 ]

3 голосов
/ 18 августа 2010

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

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 голосов
/ 18 августа 2010

См. Фрейм WPF, Content и 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()); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...