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

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

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

вот приложение.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 указывает на первый.код XAML. Первый.xaml-это страница. WPF автоматически размещает мою страницу в окне навигации. Вот первый.язык 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 и второй.xaml находятся в корне решения), и я попытался оставить CommandTarget пустым. Я также попытался установить путь к Привязка к различным связанным с навигацией общедоступным свойствам в окне NavigationWindow. Пока ничего не получилось.

что я пропустила? Я!--14-->действительно не хочу делать мою навигацию в коде.


уточнение.

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

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

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

4 ответов


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


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

надеюсь, что это помогает.


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


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"/>

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