2009-04-29 6 views
6

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

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

Вот 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. До сих пор ничего не работало.

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


Уточнение.

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

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

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

ответ

4

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

+0

Спасибо, но это не совсем применимо в этом случае. Я отредактировал свой вопрос, чтобы надеяться на его разъяснение. Я пытаюсь найти способ для кнопки Command the NavigationWindow, куда идти дальше. Мой код не работает, поэтому я не настаиваю на том, чтобы это было сделано так. Я ищу способ получить кнопку для работы с NavigationWindow. – Will

+0

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

2

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

Это работает, но для MVVM предпочтительным является командный шаблон. Спасибо за ответ. – Will

4

В XAML:

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

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

public static RoutedCommand NavigateHelp = new RoutedCommand(); 

На странице contstructor, вы можете подключить два:

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

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

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

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

0
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.

Смежные вопросы