Использование кнопки для перехода на другую страницу в NavigationWindow

Я пытаюсь использовать структуру команд навигации в WPF для перехода между страницами в приложении WPF (настольный компьютер; не XBAP или Silverlight).

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

Вот app.xaml для примера приложения:

<Application x:Class="Navigation.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="First.xaml">
</Application>

Обратите внимание, что StartupUri указывает на First.xaml. First.xaml - это страница. WPF автоматически размещает мою страницу в NavigationWindow. Вот First.xaml:

<Page x:Class="Navigation.First"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="First">
    <Grid>
        <Button 
            CommandParameter="/Second.xaml" 
            CommandTarget="{Binding RelativeSource=
                {RelativeSource 
                    FindAncestor, 
                    AncestorType={x:Type NavigationWindow}}}" 
            Command="NavigationCommands.GoToPage" 
            Content="Go!"/>
    </Grid>
</Page>

CommandTarget кнопки установлен в NavigationWindow. Это команда GoToPage, а страница - /Second.xaml. Я попытался установить CommandTarget на содержащую страницу, CommandParameter на «Second.xaml» (First.xaml и Second.xaml находятся в корне решения), и я попытался оставить CommandTarget пустым. Я также пробовал установить путь к привязке к различным общедоступным свойствам, связанным с навигацией, в NavigationWindow. Пока ничего не помогло.

Что мне здесь не хватает? Я действительно не хочу выполнять навигацию в коде.


Разъяснение.

Если вместо кнопки я использую гиперссылку:

<Grid>
    <TextBlock>
       <Hyperlink 
           NavigateUri="Second.xaml">Go!
       </Hyperlink>
    </TextBlock>
</Grid>

все работает как положено. Однако мои требования к пользовательскому интерфейсу означают, что использование гиперссылки прямо сейчас. Мне нужна большая жирная кнопка, чтобы люди ее нажимали. Вот почему я хочу использовать кнопку для навигации. Я просто хочу знать, как я могу заставить кнопку предоставлять ту же способность, что и гиперссылка в этом случае.


person Community    schedule 29.04.2009    source источник


Ответы (4)


Согласно документации, только DocumentViewer и FlowDocumentViewer реализуют эту команду специально. Вам нужно будет либо найти команду для навигации, которую NavigationWindow реализует, либо настроить CommandBinding для этой команды и обработать ее самостоятельно.

person Andy    schedule 29.04.2009
comment
Спасибо, но в данном случае это не совсем применимо. Я отредактировал свой вопрос, чтобы, надеюсь, прояснить его. Я пытаюсь найти способ для кнопки, чтобы указать NavigationWindow, куда идти дальше. Мой код не работает, поэтому я не настаиваю на том, чтобы это было сделано именно так. Я ищу способ заставить кнопку работать с NavigationWindow. - person ; 30.04.2009
comment
По сути, это единственный способ сделать это. Я использую команды в своей виртуальной машине, чтобы подключать кнопки. Модель базового представления содержит ссылку на службу навигации главного окна. - person ; 29.07.2009

В XAML:

<Button Command="{x:Static Views:Commands.NavigateHelp}" Content="Help"/>

В представлениях (у нас есть Commands.cs файл, содержащий все это):

public static RoutedCommand NavigateHelp = new RoutedCommand();

В конструкторе страниц вы можете соединить два:

CommandBindings.Add(new CommandBinding(Commands.NavigateHelp, NavigateHelpExecute));

NavigateHelpExecute может быть в коде позади (что мы и делаем), подключаться к обработчику событий ViewModel или что-то еще. Прелесть в том, что вы можете отключить другую навигацию следующим образом:

CommandBindings.Add(new CommandBinding(NavigationCommands.Refresh, null));

Надеюсь это поможет.

person Nate Noonen    schedule 07.05.2010

Вы захотите использовать NavigationService вашего NavigationWindow следующим образом:

XAML:

    <Button HorizontalAlignment="Right" Name="continueButton" Width="75" Margin="0,0,8,11" Height="23" VerticalAlignment="Bottom" Click="continueButton_Click">
        Continue
    </Button>

C#:

    private void continueButton_Click(object sender, RoutedEventArgs e)
    {
        this.NavigationService.GoForward();
        //or
        this.NavigationService.Navigate("Second.xaml")
    }

В любом из этих случаев вы можете использовать this, я показываю NavigationService здесь только для ясности.

person lkg    schedule 28.07.2009
comment
Это работает, но для MVVM предпочтительнее использовать шаблон команды. Спасибо за ответ. - person ; 18.10.2009

public class NavigateButton : Button
{
    public Uri NavigateUri { get; set; }

    public NavigateButton()
    {
        Click += NavigateButton_Click;
    }

    void NavigateButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        var navigationService = NavigationService.GetNavigationService(this);
        if (navigationService != null)
            navigationService.Navigate(NavigateUri);
    }
}

А затем вы можете поместить в свой xaml следующее:

<local:NavigateButton Content="NavigateButton" NavigateUri="Page2.xaml"/>

Тогда вам по-прежнему не нужен код для ваших страниц, и вам не нужно добавлять команды в вашу модель просмотра.

person Wouter Schut    schedule 16.03.2015