Сервис навигации Silverlight всегда пуст - PullRequest
3 голосов
/ 26 апреля 2010

Я читал, что у некоторых людей возникла проблема с этим, поэтому я хотел опубликовать (несколько) элегантное решение, которое я нашел, пытаясь решить эту проблему. Проблема заключается в том, что вы создаете шаблонные страницы в Silverlight, а ContentControls не имеют родительского фрейма NavigationService (он всегда равен нулю, когда вы пытаетесь его использовать). Существуют аналогичные сценарии, в которых NavigationService присутствует в intellisence, но всегда имеет значение null. Для включения навигации по сайту:

  1. Создайте новый UserControl (я назвал мой NavFrame), в котором есть рамка навигации (я назвал мой RootFrame).

  2. Внутри этого фрейма вы можете установить любой контент, который вам нравится.

  3. Установите этот UserControl как RootVisual в App.xaml.cs (т.е. this.RootVisual = new NavFrame();).

  4. Чтобы использовать NavigationService на любой из ваших страниц, вы можете напечатать что-то вроде:

    ((NavFrame)App.Current.RootVisual).RootFrame.NavigationService
        .Navigate(new Uri("Your Uri", UriKind.RelativeOrAbsolute));
    

Ответы [ 2 ]

1 голос
/ 28 января 2012

Вы можете создать Действие и перетащить его поверх элемента управления, который вы хотите сделать навигацией, как это:

public class NavigateAction : TriggerAction<DependencyObject>
{
    public Uri Uri
    {
        get;
        set;
    }

    protected override void Invoke(object parameter)
    {
        var frame = FindContainingFrame(AssociatedObject);

        if(frame == null)
            throw new InvalidOperationException("Could not find the containing Frame in the visual tree.");

        frame.Navigate(Uri);
    }

    protected static Frame FindContainingFrame(DependencyObject associatedObject)
    {
        var current = associatedObject;

        while(!(current is Frame))
        {
            current = VisualTreeHelper.GetParent(current);

            if(current == null)
                return null;
        }

        return (Frame)current;
    }
}

Теперь вам просто нужно перетащить его и привязать к целевой странице. Кстати, это верно для SL4, никогда не пробовал на SL3. и URI работает в форме: " / SilverlightApplication1; component / Page1.xaml " или с UriMapping на фрейме.

0 голосов
/ 10 декабря 2011
((Frame)(Application.Current.RootVisual as MainPage).FindName("ContentFrame"))
    .Navigate(new Uri("Page Name", UriKind.Relative));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...