Использование кнопки для перехода на другую страницу в NavigationWindow - PullRequest
6 голосов
/ 29 апреля 2009

Я пытаюсь использовать среду команд навигации в 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. Вот первый.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>

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

Ответы [ 4 ]

4 голосов
/ 07 мая 2010

В 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));

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

4 голосов
/ 29 апреля 2009

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

2 голосов
/ 29 июля 2009

Вы хотите использовать 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

0 голосов
/ 16 марта 2015
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"/>

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

...