2009-04-29 12 views
6

मैं डब्ल्यूपीएफ में नेविगेशन कमांड फ्रेमवर्क का उपयोग करने के लिए एक WPF एप्लिकेशन (डेस्कटॉप, एक्सबीएपी या सिल्वरलाइट नहीं) के भीतर पृष्ठों के बीच नेविगेट करने का प्रयास कर रहा हूं।नेविगेशन में किसी अन्य पृष्ठ पर नेविगेट करने के लिए बटन का उपयोग करना विन्डो

मेरा मानना ​​है कि मेरे पास सब कुछ ठीक से कॉन्फ़िगर किया गया है, फिर भी यह काम नहीं कर रहा है। मैं त्रुटियों के बिना निर्माण और चलाता हूं, मुझे आउटपुट विंडो में कोई बाध्यकारी त्रुटियां नहीं मिल रही हैं, लेकिन मेरा नेविगेशन बटन अक्षम है।

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

नोट First.xaml को StartupUri अंक:

यहां एक नमूना अनुप्रयोग के लिए App.xaml है। First.xaml एक पृष्ठ है। WPF स्वचालित रूप से नेविगेशनविंडो में मेरे पृष्ठ को होस्ट करता है। यहाँ 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 है। मैंने कमांड पैरामीटर को युक्त पेज पर, कमांड पैरामीटर को "सेकेंड.एक्सएमएल" (फर्स्ट.एक्सएएमएल और सेकेंड.एक्सएएमएल दोनों समाधान की जड़ में हैं) पर सेट करने का प्रयास किया है, और मैंने कमांड टाउन को खाली छोड़ने का प्रयास किया है। मैंने NavigationWindow पर विभिन्न नेविगेशन-संबंधित सार्वजनिक गुणों के लिए बाध्यकारी पथ को सेट करने का भी प्रयास किया है। अभी तक कुछ भी काम नहीं किया है।

मुझे यहां क्या याद आ रही है? मैं वास्तव में कोड में अपना नेविगेशन नहीं करना चाहता हूं।


स्पष्टीकरण।

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

सब कुछ उम्मीद के रूप में काम करता है:

, तो इसके बजाय एक बटन का उपयोग कर के, मैं एक हाइपरलिंक का उपयोग करें। हालांकि, मेरी यूआई आवश्यकताओं का मतलब है कि एक हाइपरलिंक का उपयोग करना सही है। लोगों को प्रेस करने के लिए मुझे एक बड़ा फैटी बटन चाहिए। यही कारण है कि मैं नेविगेट करने के लिए बटन का उपयोग करना चाहता हूं। मैं सिर्फ यह जानना चाहता हूं कि इस मामले में हाइपरलिंक की समान क्षमता प्रदान करने के लिए मैं बटन कैसे प्राप्त कर सकता हूं।

उत्तर

4

documentation के अनुसार, केवल DocumentViewer और FlowDocumentViewer इस आदेश को विशेष रूप से लागू करें। आपको या तो नेविगेशन के लिए कमांड की आवश्यकता होगी कि NavigationWindow लागू करें, या इस आदेश के लिए CommandBinding सेट करें और इसे स्वयं प्रबंधित करें।

+0

धन्यवाद, लेकिन यह इस मामले में बिल्कुल लागू नहीं है। मैंने आशा व्यक्त करने के लिए अपना प्रश्न संपादित कर लिया है। मैं नेविगेशनविंडो को कमांड करने के लिए बटन के लिए रास्ता खोजने का प्रयास कर रहा हूं, जहां आगे जाना है। मेरा कोड काम नहीं करता है, इसलिए मैं जोर नहीं दे रहा हूं कि यह इस तरह से किया जायेगा। मैं NavigationWindow के साथ काम करने के लिए एक बटन पाने के लिए एक रास्ता तलाश रहा हूँ। – Will

+0

अनिवार्य रूप से ऐसा करने का यही एकमात्र तरीका है। मैं बटन को हुक करने के लिए अपने वीएम में कमांड का उपयोग कर रहा हूं। बेस व्यू मॉडल में मुख्य विंडो की नेविगेशन सेवा का संदर्भ है। – Will

2

इस प्रकार आप अपने NavigationWindow की NavigationService उपयोग करना चाहते हैं जाएगा:

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 दिखाएं

+0

यह काम करता है, लेकिन एमवीवीएम के लिए कमांड पैटर्न बेहतर है। जवाब के लिए धन्यवाद। – Will

4

XAML में:

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

दृश्य में (हम जानते हैं कि इन सब में शामिल है एक Commands.cs फ़ाइल है):

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

public static RoutedCommand NavigateHelp = new RoutedCommand(); 

पृष्ठ contstructor में, आप दो कनेक्ट कर सकते हैं

NavigateHelpExecute पीछे कोड में हो सकता है (जो हम करते हैं), एक व्यूमोडेल इवेंट हैंडलर में हुक, या जो भी हो। इसकी सुंदरता यह है कि आप अन्य नेविगेशन को इस प्रकार अक्षम कर सकते हैं:

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।

संबंधित मुद्दे

 संबंधित मुद्दे