문제

WPF의 Navigation 명령 프레임 워크를 사용하여 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는 내비게이션 위로에서 내 페이지를 자동으로 호스팅합니다. 다음은 첫 번째입니다 .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>

모든 것이 예상대로 작동합니다. 그러나 내 UI 요구 사항은 하이퍼 링크를 사용하는 것이 바로 나온 것을 의미합니다. 사람들이 누르기 위해서는 큰 지방 버튼이 필요합니다. 그렇기 때문에 버튼을 사용하여 탐색하고 싶습니다. 이 경우 하이퍼 링크가 수행하는 것과 동일한 기능을 제공하기 위해 버튼을 얻을 수있는 방법을 알고 싶습니다.

도움이 되었습니까?

해결책

에 따르면 선적 서류 비치, 뿐 DocumentViewer 그리고 FlowDocumentViewer 이 명령을 구체적으로 구현하십시오. 내비게이션 명령을 찾아야합니다. NavigationWindow 구현 또는 설정 a CommandBinding 이 명령을 위해 직접 처리하십시오.

다른 팁

XAML에서 :

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

견해에서 (우리는 a 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));

도움이 되었기를 바랍니다.

당신은 사용하고 싶을 것입니다 NavigationService 당신의 NavigationWindow 다음과 같이 :

XAML :

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

씨#:

    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에 명령을 추가 할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top