باستخدام زر للانتقال إلى صفحة أخرى في NavigationWindow

StackOverflow https://stackoverflow.com/questions/803921

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا أحاول أن استخدام إطار القيادة الملاحة في برنامج الأغذية العالمي للتنقل بين الصفحات داخل تطبيق WPF (سطح المكتب، لا XBAP أو سيلفرلايت).

وأعتقد أن لدي كل شيء تكوينه بشكل صحيح، ولكن لا يعمل. I بناء وتشغيل بدون أخطاء، وأنا لا تحصل على أي أخطاء ملزمة في إطار الإخراج، ولكن يتم تعطيل زر التنقل بلدي.

وهنا يكمن 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>

وكل شيء يعمل كما هو متوقع. ومع ذلك، ومتطلبات UI بلدي يعني أن استخدام ارتباط تشعبي هو الحق في الخروج. انا بحاجة الى زر الدهنية كبيرة للناس للضغط. لهذا السبب أريد أن استخدام زر للتنقل. أنا فقط أريد أن أعرف كيف يمكنني الحصول على زر لتوفير نفس القدرة أن ارتباط تشعبي يفعل في هذه الحالة.

نصائح أخرى

في 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));

وآمل أن يساعد هذا.

وسوف تحتاج إلى استخدام 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 الخاص بك.

scroll top